sed '$!N;/\n.*completed/d;P;D' <input
Это удалит из вывода все входные строки, за которыми не следует строка, соответствующая строке завершено .
Попробуйте следующее:
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
Здесь адаптировано к вашей конкретной реализации переименования
.
Хотя это можно сделать с помощью команды 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.
С версией переименования, которую вы, кажется, используете, следующее выражение
должно выполнить запрашиваемое вами преобразование (например, с каталогом
, содержащим файлы с именем 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
является обратной ссылкой на группу в круглых скобках, цифру
и точку, и оставляет ее без изменений в новом имени файла.
Я покончил с 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
Один ответ выше дает:
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
.