4

Я хотел бы переименовать все файлы из папки с помощью регулярных выражений (добавить имя в конец имени) и перейти в другую папку.

По моему мнению, это должно выглядеть так:

mv -v ./images/*.png ./test/*test.png , но это не работает.

Кто-нибудь может предложить мне решение?

3 ответа3

7

Существует удобный сценарий переименования файлов perl, который устанавливается вместе с основным пакетом Perl в системах на основе Debian (включая Ubuntu). Обычно его называют rename , но иногда называют prename (Perl переименовывать). Используйте как это:

rename expr file1 file2 file3

Команда использует Perl для оценки expr для каждого аргумента file , и она переименовывает каждый файл в выходные данные оценки expr . Итак, для простых замен регулярных выражений, как ваш пример:

rename 's(images/(.*)\.png$)(test/$1.test.png)' ./images/*

# here's the expression:
# s()()   -- just like s/// (but i don't need to escape the / in the filename)
#   match regex:  images/(.*)\.png$     -- match filenames of the form images/*.png
#   replace:      test/$1.test.png     -- turn them into test/*.test.png

Если файлы не соответствуют выражению (например, файлы не в формате PNG), подстановка ничего не изменит и их имена не будут изменены.

6

Мне также нравится команда переименования, опубликованная John T, но она доступна не во всех системах. Это должно работать везде:

for i in *.png; do mv -v $i `basename $i .png`.test.png; done
2

Вы можете использовать rename которое принимает регулярные выражения или этот основной синтаксис с тремя аргументами:

rename .png .test.png *.png
  • Первый аргумент - что заменить в имени файла
  • Второй аргумент в том, что заменить его
  • Третьим аргументом является то, какие файлы для выполнения операции, в данном случае, всех PNG.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .