Как переименовать файлы в текущем каталоге и его подкаталогах 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/" {} ";"
просто имейте в виду, что Gentoo Linux имеет свои точки утилиты переименования в
http://developer.berlios.de/project/showfiles.php?group_id=413
его ebuild
для Debian или, может быть, Ubuntu,
rename
is /usr/bin/prename
, который является скриптом perl
посмотреть rename --help
прежде чем ваш двигаться.