Назад | Перейти на главную страницу

Как переименовать несколько файлов, заменив слово в имени файла?

Заменить ACDC на AC-DC

Например у нас есть эти файлы

ACDC - Rock N 'Roll Ain't Noise Pollution.xxx

ACDC - Rocker.xxx

ACDC - Стреляй в азарт.xxx

Я хочу, чтобы они стали:

AC-DC - Рок-н-ролл - это не шумовое загрязнение.xxx

AC-DC - Rocker.xxx

AC-DC - Стреляй в азарт.xxx

Я знаю, что для этой операции используется sed или awk. Я ничего не могу погуглить, поэтому прошу вашей помощи =) Не могли бы вы предоставить полную рабочую команду оболочки для этой задачи?

Обратная связь: Решение для пользователей OSX

rename 's/ACDC/AC-DC/' *.xxx

из man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

Например, чтобы переименовать все файлы, соответствующие «* .bak», чтобы убрать расширение, вы можете сказать

rename 's/\.bak$//' *.bak

Чтобы перевести имена из верхнего регистра в нижний, вы должны использовать

rename 'y/A-Z/a-z/' *

Этот ответ содержит положительные моменты из всех других ответов, но не учитывает такую ​​ересь, как ls | while read.

Текущий каталог:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Включая подкаталоги:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Символы новой строки действительно вряд ли будет в именах файлов, поэтому это может быть проще, работая с именами, содержащими пробелы:

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Чтобы использовать версию util-linux rename о котором упоминал Фил (в Ubuntu это называется rename.ul):

rename ACDC AC-DC ACDC*

или

rename.ul ACDC AC-DC ACDC*

Использование оболочки bash

find . -type f -name "ACDC*" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/ACDC/AC-DC/"`
   mv "$f" "$new"
done

Примечание: использование find будет обрабатывать текущий каталог и каталоги под.

Зависит от вашей оболочки. В zsh я бы сделал так:

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

Возможно не лучшее решение, но работает.

Используя bash:

ls *.xxx | while read fn; do
    mv "${fn}" "${fn/ACDC/AC-DC}";
done

Если у вас есть rename программа установлена:

rename 's/ACDC/AC-DC/' *.xxx