Переименование файлов с пробелами без изменения чисел

Хотя это можно сделать с помощью команды 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
06.09.2017, 08:41
3 ответа

Используйте преимядля этого:

prename 's/\D*(\d*).*/$1.ext/' *.ext

Для всех указанных файлов это заменяет расширенное регулярное выражение \D*\d*.*(число нецифр, следующих за числом цифр и остальной частью имени) частью, окруженной (), которые являются цифрами, и расширением.

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

prename 's/ .*/.ext/' *.ext
1
27.01.2020, 23:18

Вы можете попробовать:

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

Файлы без пробелов в имени не будут обрабатываться.

3
27.01.2020, 23:18

Можно использовать переименование 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

Информация:

  1. (\d)\sfoo_\dили(\d)\s.*_\d:соответствует имени вашего файла
  2. (\d):возвращает цифры впереди
  3. $1:возвращаемое значение (s )переменная в2
  4. -n:используется для просмотра результата команды prename, удалите, чтобы внести изменения

См.:man prename

0
27.01.2020, 23:18

Теги

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