Я хотел бы переименовать все файлы в папке так, чтобы иметь последовательные числа. Например:
1.png
2.png
3.png
etc
Я знаю, что существует переименовать команда, и я знаю, что существуют десятки подобных вопросов в здесь, но я не могу найти путь.
Примечание: Предложенный дубликат не содержит решение, специфичное для моего случая. Прекратите отмечать это как дубликат, потому что предложенный дубликат не отвечает на мой вопрос
Принятие Вас хочет следовать за оболочкой 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
Вот маленький сценарий 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)