Хотя это можно сделать с помощью команды 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.
Используйте преимя
для этого:
prename 's/\D*(\d*).*/$1.ext/' *.ext
Для всех указанных файлов это заменяет расширенное регулярное выражение \D*\d*.*
(число нецифр, следующих за числом цифр и остальной частью имени) частью, окруженной ()
, которые являются цифрами, и расширением.
После редактирования вопроса кажется, что имена файлов начинаются с цифры, за которой следует пробел. Это делает его еще проще:
prename 's/ .*/.ext/' *.ext
Вы можете попробовать:
for a in *.ext; do mv "$a" "${a/ */}.ext"; done
Объяснение :
для файла *.ext
- получить все файлы с расширением .ext
в текущем каталоге;
a/ */
- заменить подстроку ничем ( ${string/substring/replacement} ). Эта конструкция получает все символы после пробела (включительно) и удаляет их.
.
Или, если у вас есть файлы с разными расширениямии вам нужно обработать все файлы в каталоге, попробуйте:
for a in *; do mv "$a" "${a/ *\./\.}"; done
Эквивалент команды Perl rename:
prename 's/ .*\./\./' *
Пример: файлы
100 foo_1.ext
200 foo_1.ext
201 foo_3.ext
3401 txt_3.txt
будет переименовано в
100.ext
200.ext
201.ext
3401.txt
Файлы без пробелов в имени не будут обрабатываться.
Можно использовать переименование Perl (, а не Linux ):
prename -n 's/(\d*)\s*foo_\d*/$1/g' /path/to/folder/*.ext
или
prename -n 's/(\d*)\s*.*_\d*/$1/g' /path/to/folder/*.ext
Примеры имен файлов:
100 foo_2.ext
101 foo_1.ext
200 foo_234.ext
302 foo_2.ext
Результаты:
100.ext
101.ext
200.ext
302.ext
Информация:
(\d)\sfoo_\d
или(\d)\s.*_\d
:соответствует имени вашего файла (\d)
:возвращает цифры впереди $1
:возвращаемое значение (s )переменная в2
-n
:используется для просмотра результата команды prename
, удалите, чтобы внести изменения См.:man prename