如何递归更改文件名以匹配?

如何递归更改文件名以匹配?

我试图在目录中递归地更改多个文件的名称,如下所示:

parentdirectory/dir1/foo_1.txt
               /dir2/bar_1.txt
               /dir3/foo_2.txt

因为我使用的工具无法识别通配符,所以我想从每个以“1.txt”结尾的文件中删除文本,以便每个实例完全匹配。

我可以生成这些文件的列表到 STDOUT 并将其通过管道传输到某个地方:

find . -name '*1.txt' -print0 |

...但我不确定如何编写(我假设)存在的正则表达式来重命名文件。此外,改名未随我的设置一起安装,并且我没有添加它的权限。

答案1

您可以在 for 循环中使用 find 语句并使用 shell 子字符串替换。像这样的东西。

for file_name in $(find . -name '*1.txt' -print0); do
    #echo mv -v "$file_name" "${file_name/substring_to_be_replaced/the_replacement_substring}"
    mv -v "$file_name" "${file_name/substring_to_be_replaced/the_replacement_substring}"
done

只需将您的值放入substring_to_be_replaced和即可the_replacement_substring。有关如何替换子字符串的更多信息,请参阅此处https://stackoverflow.com/questions/13210880/replace-one-substring-for-another-string-in-shell-script

并首先使用注释掉的 echo 语句来确保您的子字符串替换和查找正确工作。当您确定一切正常时,注释掉 echo 并使用实际的mv语句。一旦你开始mv使用错误的参数,就很难甚至不可能撤消。

相关内容