6

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

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

4 回答 4

6

你也可以试试:

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

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

于 2012-05-11T18:11:46.253 回答
3

尝试:

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

Find 确实已经为您的文件提供了一个迭代器 - 您不需要foraround it 或xargsbehind ,这很常见。好吧 - 在极少数情况下,它们可能会有所帮助,但通常不会。

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

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

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

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

find . -name "*.wav.gz" -exec rename -v "s/^abcd124(.+)/abcd1234\1/" {} ";"
于 2012-05-11T00:17:33.103 回答
1

bash4:

shopt -s globstar
rename -v "s/^$dir\/abcd124(.+)/$dir\/abcd1234$1/" **/*.wav.gz;
于 2012-05-11T18:46:43.990 回答
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,

renameis /usr/bin/prename,这是一个 perl 脚本

搬家前先看看rename --help

于 2012-05-13T16:49:55.350 回答