Заменить 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