我试图在目录中递归地更改多个文件的名称,如下所示:
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
使用错误的参数,就很难甚至不可能撤消。