基于正则表达式递归重命名目录和文件

时间:2013-02-27 22:19:12

标签: regex linux bash pcre

我想剥去所有“?”在给定目录中的文件名中,有更多的子目录,并且它们中有子目录。我已经尝试使用一个简单的perl正则表达式脚本与系统调用,但它无法递归每个子目录,并且手动去浪费时间太多。我怎样才能解决我的问题?

3 个答案:

答案 0 :(得分:1)

您可以使用查找命令搜索带有“?”的文件名然后使用其 exec 参数运行一个删除“?”的脚本文件名中的字符。考虑一下这个脚本,你可以保存到/usr/local/bin/rename.sh,例如(记得给它+ x权限):

#!/bin/sh
mv "$1" "$(echo $1| tr -d '?')"

然后这将完成工作:

find -name "*\?*" -exec rename.sh {} \;

答案 1 :(得分:0)

试试这个:

find -name '*\?*' -exec prename 's/\?//g' {} +

请参阅https://metacpan.org/module/RMBARKER/File-Rename-0.06/rename.PL(这是Ubuntu发行版上的默认rename命令)

答案 2 :(得分:0)

使用'?'查找所有名称并删除所有这些。可能也可以使用-exec选项,但需要额外的脚本

for f in $(find $dir -name "*?*" -a -type f) ; do
    mv $f ${f/?/}
done