如何使用bash脚本重命名当前目录及其子目录中的文件?

时间:2012-05-10 23:47:36

标签: bash shell command-line rename subdirectory

我可以使用'rename'命令将缺少的字符添加到当前目录中的所有文件名中,如下所示:

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

但是,我想为当前目录所有子目录执行此操作。我试过这个:

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

但是,如果$dir变量包含以下任何特殊字符:{}[]()^$.|*+?\,那么它们不能正确转义\并且我的脚本失败。

解决此问题的最佳方法是什么?另外,你们怎么想用awk来解决这个问题(优点/缺点?)

4 个答案:

答案 0 :(得分:6)

您也可以尝试:

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

它适用于具有“xargs”命令的较新的Unix系统。请注意,我稍微编辑了正则表达式。

答案 1 :(得分:3)

尝试:

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

查找确实已经为您的文件提供了一个迭代器 - 您不需要在其周围forxargs后面,这是常见的。嗯 - 在极少数情况下,它们可能会有所帮助,但通常不会。

这里,-execdir非常有用。 Gnu-find有它;我不知道你的发现是否也有。

但是您需要确保在启动此命令的目录中没有* .wav.gz文件,因为否则您的shell将展开它,并将展开的名称移交给重命名。

注意:我收到重命名的警告,我应该在正则表达式中用$ 1替换\ 1,但如果我这样做,则不会捕获该模式。我必须使用\ 1来使它工作。

这是另一种方法。如果我们搜索wav.gz文件,为什么要搜索目录呢?

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

答案 2 :(得分:1)

bash 4:

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

答案 3 :(得分:1)

请注意,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/usr/bin/prename,这是一个perl脚本

移动前请先查看rename --help