我可以使用'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
来解决这个问题(优点/缺点?)
答案 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 ";"
查找确实已经为您的文件提供了一个迭代器 - 您不需要在其周围for
或xargs
后面,这是常见的。嗯 - 在极少数情况下,它们可能会有所帮助,但通常不会。
这里,-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
对于Debian或者Ubuntu,
rename
是/usr/bin/prename
,这是一个perl脚本
移动前请先查看rename --help
。