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

sed '$!N;/\n.*completed/d;P;D' <input

Это удалит из вывода все входные строки, за которыми не следует строка, соответствующая строке завершено .

8
23.02.2017, 16:23
5 ответов

Попробуйте следующее:

rename -e 's/\d+/sprintf("%02d",$&)/e' -- *.jpg

Пример:

$ ls
Device_Ex_10.jpg  Device_Ex_1.jpg  Device_Ex_4.jpg  Device_Ex_7.jpg
Device_Ex_11.jpg  Device_Ex_2.jpg  Device_Ex_5.jpg  Device_Ex_8.jpg
Device_Ex_12.jpg  Device_Ex_3.jpg  Device_Ex_6.jpg  Device_Ex_9.jpg
$ rename -e 's/\d+/sprintf("%02d",$&)/e' -- *.jpg
$ ls
Device_Ex_01.jpg  Device_Ex_04.jpg  Device_Ex_07.jpg  Device_Ex_10.jpg
Device_Ex_02.jpg  Device_Ex_05.jpg  Device_Ex_08.jpg  Device_Ex_11.jpg
Device_Ex_03.jpg  Device_Ex_06.jpg  Device_Ex_09.jpg  Device_Ex_12.jpg

Я взял ссылку отсюда: https://stackoverflow.com/questions/5417979/batch-rename-sequential-files- by-padding-with-zeroes

Здесь адаптировано к вашей конкретной реализации переименования .

21
27.01.2020, 20:09

Хотя это можно сделать с помощью команды prename , я хотел бы предоставить ей альтернативу на языке Python:

$ ls
File_Ex_1.jpg  File_Ex_2.jpg  File_Ex_3.jpg  File_Ex_4.jpg

$ ./pad_zeros.py *                                                                                                       

$ ls
File_Ex_01.jpg  File_Ex_02.jpg  File_Ex_03.jpg  File_Ex_04.jpg  pad_zeros.py*

Сценарий pad_zeros.py прост:

#!/usr/bin/env python
import sys,os,re

for file in sys.argv[1:]:
    if __file__ in file: continue
    words = re.split('_|\.',file)
    words[-2] = words[-2].zfill(2)
    new_name = "_".join(words[:-1]) + "." + words[-1]
    os.rename(file,new_name)

Он принимает аргументы в командной строке, выполняет итерацию по ним и дополняет нулями с помощью команды .zfill () (в этом частный случай для двух символов). Поскольку мы работаем со всеми файлами в одной папке, можно использовать glob-star.

1
27.01.2020, 20:09

С версией переименования, которую вы, кажется, используете, следующее выражение должно выполнить запрашиваемое вами преобразование (например, с каталогом , содержащим файлы с именем File_Ex_ {1 .. 11} .jpg ):

$ rename -n -e 's/_(\d\.)/_0$1/g' -- *.jpg
'File_Ex_1.jpg' would be renamed to 'File_Ex_01.jpg'
'File_Ex_2.jpg' would be renamed to 'File_Ex_02.jpg'
'File_Ex_3.jpg' would be renamed to 'File_Ex_03.jpg'
'File_Ex_4.jpg' would be renamed to 'File_Ex_04.jpg'
'File_Ex_5.jpg' would be renamed to 'File_Ex_05.jpg'
'File_Ex_6.jpg' would be renamed to 'File_Ex_06.jpg'
'File_Ex_7.jpg' would be renamed to 'File_Ex_07.jpg'
'File_Ex_8.jpg' would be renamed to 'File_Ex_08.jpg'
'File_Ex_9.jpg' would be renamed to 'File_Ex_09.jpg'

(Удалите флаг -n , чтобы фактически выполнить переименование.)

Аргумент -e - это поиск Perl и -заменить выражение; где _ (\ d \.) соответствует знаку подчеркивания, за которым следует одна цифра, а затем точка , и заменяет подчеркивание на _0 , таким образом вставляя ведущий ноль. $ 1 является обратной ссылкой на группу в круглых скобках, цифру и точку, и оставляет ее без изменений в новом имени файла.

3
27.01.2020, 20:09

Я покончил с ls + awk + shради вызова:

ls -1 | awk -F_ '{printf "%s%02d.jpg\n", "mv "$0" "$1"_"$2"_", $3}' | sh

-F_............... field separator
%s................ string to "mv "$0" "$1"_"$2"_"
%02d.............. our numeric field with leading zeros

Чтобы просто увидеть команду без модификаций, удалите| sh

0
15.11.2020, 13:19

Один ответ выше дает:

rename -e 's/\d+/sprintf("%02d",$&)/e' -- *.jpg

Однако для меня это дает неправильные результаты, так как *.jpg сортирует файлы в строгом порядке номеров. Запуск renameс флагом -nдля пробного прогона дает мне:

rename(9999.jpg, frames_0000039996.jpg) 
rename(999.jpg, frames_0000039997.jpg) 
rename(99.jpg, frames_0000039998.jpg) 
rename(9.jpg, frames_0000039999.jpg)

Правильные результаты можно получить с:

rename 's/.+/our $i; sprintf("frames_%010d.jpg", 0+$i++)/e' $(ls -1 | sort -V)

, что дает

rename(9999.jpg, frames_0000039996.jpg)
rename(999.jpg, frames_0000039997.jpg)
rename(99.jpg, frames_0000039998.jpg)
rename(9.jpg, frames_0000039999.jpg)

с флагом -n.

0
12.01.2021, 19:33

Теги

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