Unix Bash переименовывает файлы с помощью регулярных выражений

17433
mxg

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

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

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

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

4

3 ответа на вопрос

7
quack quixote

Существует удобный сценарий переименования файлов 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
Hal Pomeranz

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

for i in *.png; do mv -v $i `basename $i .png`.test.png; done 
вот что он возвращает: использование: mv [-f | -i | -n] [-v] исходная цель mv [-f | -i | -n] [-v] source ... каталог mxg 14 лет назад 0
Сработало для меня: возможно, вам стоит попробовать процитировать экземпляры вашего $ i: "$ i" Jeremy L 14 лет назад 2
Это работает также для Mac. mxg 14 лет назад 0
Это более или менее стандартный UNIX-способ решения задачи, поскольку все, что вам нужно, это оболочка Bourne. Метод perl является новомодным. Круто, но новомодно. pcapademic 14 лет назад 0
@EricJLN: это только «новомодный» по сравнению с самой UNIX - Perl существует уже более двух десятилетий. (для сравнения, оболочка Bourne всего на десять лет старше; `bash` того же возраста, что и Perl.) Поваренная книга Perl была опубликована в 1998 году и включает в себя простую версию того же сценария; это конечно старше этого. quack quixote 14 лет назад 0
2
John T

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

переименовать .png .test.png * .png
  • Первый аргумент - что заменить в имени файла
  • Второй аргумент в том, что заменить его
  • Третьим аргументом является то, какие файлы для выполнения операции, в данном случае, всех PNG.
это то же самое, что и переименование perl, которое я описываю, или что-то еще? Я не знаком с синтаксисом, который вы описываете. quack quixote 14 лет назад 0
Я так не думаю. Это двоичный файл. Смотрите здесь: http://linux.die.net/man/1/rename и здесь: http://pastebin.ca/1726871. John T 14 лет назад 0
спасибо, это интересно. может быть, поэтому упомянутое мной переименование устанавливается в `/ usr / bin / prename`, а затем по символической ссылке в` / usr / bin / rename`. quack quixote 14 лет назад 0