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

如何使用bash脚本重命名当前目录及其子目录中的文件?,bash,shell,command-line,rename,subdirectory,Bash,Shell,Command Line,Rename,Subdirectory,我可以使用“重命名”命令将缺少的字符添加到当前目录中的所有文件名中,如下所示: 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(

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

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
变量包含以下任何特殊字符:
{}[]()^$.\124;*+?\
,则它们不能用\正确转义,并且我的脚本失败

解决这个问题的最好办法是什么?另外,你们觉得用
awk
解决这个问题怎么样(优点/缺点?

试试:

find ./ -type d -execdir rename -v "s/^abcd124(.+)/abcd1234\1/" *.wav.gz ";"
Find已经为您的文件提供了一个迭代器-您不需要在其周围使用
for
,也不需要在其后面使用
xargs
,这是常见的。在极少数情况下,它们可能会有帮助,但通常不会

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

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

注意:我从rename中得到一个警告,我应该在正则表达式中将\1替换为$1,但是如果我这样做,该模式就不会被捕获。我必须使用\1才能使其正常工作

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

find . -name "*.wav.gz" -exec rename -v "s/^abcd124(.+)/abcd1234\1/" {} ";"
您也可以尝试:

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

它在具有“xargs”命令的较新Unix系统上工作。注意,我稍微编辑了正则表达式。

bash
4:

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

请注意,GentooLinux的重命名实用程序指向

按其电子版本

对于Debian或者Ubuntu

rename
/usr/bin/prename
,它是一个perl脚本


在移动之前,请参阅
重命名--help

它不起作用!:(我运行了它,它没有重命名任何东西。我尝试删除“*.wav.gz”周围的引号,在这种情况下,它将一个文件重命名为abcd1234(不识别$1)然后无法重命名其他文件,因为它们与abcd1234冲突。不过谢谢你的建议,我学到了很多。还有其他想法吗?@jessica:你是对的。我更改了代码和解释,请参见最后两段。这也不起作用-它会对起始目录中的每个文件发出警告,不会重命名它们,也不会查看其子目录。此外,出于我的目的,脚本需要从起始目录中运行,并且不能为每个文件打印警告。它需要防弹!我测试了它,它对我有效。现在我采用了第二种方法(最后2行)我也测试了它。它也能工作,也给了我警告,但如果我认真对待警告,它就不起作用了。当然,你可以通过附加
2>/dev/null
来超越警告。或者你打开重命名为的perl脚本,然后在那里超越/纠正它。或者向againts rename提交错误报告。或者重写重命名的部分,然后你可以修改它需要,但我不会。我会接受警告。我可以向您断言,程序是否防弹并不取决于警告消息,但我也会怀疑。您给我的上一个脚本也不适用于我-它对所有要重命名的文件(包括文件名中带有空格的文件)发出警告,但没有重命名它们!对于包含空格的文件名,将失败。这是真的。虽然我现在需要重命名的文件的文件名中没有空格,但我将来使用的文件可能会有空格。我如何使脚本占文件名中的空格?