Переименуйте все файлы в папке к последовательным числам

Я хотел бы переименовать все файлы в папке так, чтобы иметь последовательные числа. Например:

1.png
2.png
3.png
etc

Я знаю, что существует переименовать команда, и я знаю, что существуют десятки подобных вопросов в здесь, но я не могу найти путь.

Примечание: Предложенный дубликат не содержит решение, специфичное для моего случая. Прекратите отмечать это как дубликат, потому что предложенный дубликат не отвечает на мой вопрос

5
задан 7 August 2016 в 13:06

2 ответа

Принятие Вас хочет следовать за оболочкой globbing порядок при сортировке файлов, можно сделать:

#!/bin/bash
counter=0
for file in *; do 
    [[ -f $file ]] && echo mv -i "$file" $((counter+1)).png && ((counter++))
done

Здесь цикличное выполнение по всем файлам в текущем каталоге и переименовывающий последовательно на основе порядка, если Вы хотите иметь дело с только эти .png файлы, использование for file in *.png вместо этого. counter переменная будет отслеживать инкременты.

Это - пробный прогон, удалите echo, чтобы позволить фактическому действию переименования произойти.

Пример:

$ counter=0; for file in *; do [[ -f $file ]] && echo mv -i "$file" $((counter+1)).png && ((counter++)); done
mv -i file.txt 1.png
mv -i foo.sh 2.png
mv -i bar.txt 3.png
9
ответ дан 23 November 2019 в 08:48

Вот маленький сценарий Python, который может сделать то, что Вы спрашиваете

Основное использование:

python rename_files.py Pictures/

Это распечатает вывод к stdout прежде, чем переименовать каждый файл

Эта версия продвигает индекс, пока не найдено, что имя файла с таким индексом не взято. Хотя имена файлов могут запуститься в другом индексе после последовательных повторений сценария, сами файлы остаются неизменными.

import os
import sys

top_dir = os.path.abspath(sys.argv[1])
files = os.listdir( top_dir )

for index,item in enumerate(files):
    if os.path.isdir( os.path.join(top_dir,item) ):
       files.pop(index)

files.sort()

duplicates = []
last_index = None
for index,item in enumerate(files):

    last_index = index
    extension = ""
    if '.' in item:
        extension = '.' + item.split('.')[-1]
    old_file = os.path.join(top_dir,item)
    new_file = os.path.join(top_dir,str(index) + extension  )
    while os.path.isfile(new_file):
          last_index += 1
          new_file = os.path.join(top_dir,str(last_index) + extension  )
    print( old_file + ' renamed to ' + new_file ) 
    os.rename(old_file,new_file)

Альтернативная версия, решает проблему с дублирующимися именами файлов путем добавления метки времени к каждому имени файла и затем перечисления их. Это решение может занять время, как количество увеличений файлов, но для каталогов, которые располагаются в сотнях, это не займет много времени

import os
import sys
import time

top_dir = os.path.abspath(sys.argv[1])
files = os.listdir( top_dir )

for index,item in enumerate(files):
    if os.path.isdir( os.path.join(top_dir,item) ):
       files.pop(index)

files.sort()
timestamp = str(int(time.time()))
for item in files:
    os.rename( os.path.join(top_dir,item) ,
               os.path.join(top_dir, timestamp + item) )

files2 = os.listdir( top_dir )

for index,item in enumerate(files2):
    if os.path.isdir( os.path.join(top_dir,item) ):
       files2.pop(index)

for index,item in enumerate( files2  ):

    last_index = index
    extension = ""
    if '.' in item:
        extension = '.' + item.split('.')[-1]
    old_file = os.path.join(top_dir,item)
    new_file = os.path.join(top_dir,str(index) + extension  )

    while os.path.isfile(new_file):
          last_index += 1
          new_file = os.path.join(top_dir,str(last_index) + extension  )
    print( old_file + ' renamed to ' + new_file ) 
    os.rename(old_file,new_file)
2
ответ дан 23 November 2019 в 08:48

Другие вопросы по тегам:

Похожие вопросы: