Как переименовать файлы в текущем каталоге и его подкаталогах bash скрипт?

Я могу использовать команду "переименовать", чтобы добавить отсутствующий символ ко всем именам файлов в текущем каталоге следующим образом:

echo "Renaming files..."
rename -v "s/^abcd124(.+)/abcd1234/" *.wav.gz;
echo "Done."

тем не менее, я хотел бы сделать это для текущего каталога и все его подкаталоги. Я попробовал:

echo "Renaming files..."
for dir in $(find ./ -type d); do
    rename -v "s/^$dir/abcd124(.+)/$dir/abcd1234/" *.wav.gz;
done;
echo "Done."

однако, если $dir переменная содержит любой из этих специальных символов: {}[]()^$.|*+? тогда они не экранируются должным образом с и мой скрипт терпит неудачу.

что было бы лучшим способом решить эта проблема? Кроме того, что вы, ребята, думаете об использовании awk для решения этой проблемы (преимущества/недостатки?)

4 ответов


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

find . -name "*.wav.gz" | xargs rename -v "s/abcd124*/abcd1234/"

он работает на более новых системах Unix с доступной командой "xargs". Обратите внимание, что я немного отредактировал регулярное выражение.


попробуй:

find ./ -type d -execdir rename -v "s/^abcd124(.+)/abcd1234/" *.wav.gz ";"

Find уже предоставляет итератор над вашими файлами-вам не нужно for или xargs сзади, которые часто видны. Ну, в редких случаях они могут быть полезны, но обычно нет.

здесь, - execdir полезен. Gnu-find имеет его; я не знаю, есть ли у вашей находки тоже.

но вам нужно убедиться, что у вас нет *.в формате WAV.GZ-файл в dir вы запускаете эту команду, потому что иначе ваша оболочка расширит ее и передаст развернутые имена для переименования.

Примечание: я получаю предупреждение от rename, что я должен заменить \1 на $1 в регулярном выражении, но если я это сделаю, шаблон не будет пойман. Я должен использовать \1, чтобы заставить его работать.

вот еще один подход. Зачем вообще искать каталоги, если мы ищем wav.gz-файлы?

find . -name "*.wav.gz" -exec rename -v "s/^abcd124(.+)/abcd1234/" {} ";"

на bash 4:

shopt -s globstar
rename -v "s/^$dir\/abcd124(.+)/$dir\/abcd1234/" **/*.wav.gz;

просто имейте в виду, что Gentoo Linux имеет свои точки утилиты переименования в

http://developer.berlios.de/project/showfiles.php?group_id=413

его ebuild

http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/sys-apps/rename/rename-1.3.ebuild?view=markup

для Debian или, может быть, Ubuntu,

rename is /usr/bin/prename, который является скриптом perl

посмотреть rename --help прежде чем ваш двигаться.