0

我设法用 find 命令找到了几个文件。这些文件的类型为file_sakfksanf.txt、file_afsjnanfs.pdf、file_afsnjnjans.cpp, 现在我想使用 rename 和 -exec 命令将它们重命名为 mywish_sakfksanf.txt、mywish_afsjnanfs.pdf、mywish_afsnjnjans.cpp ,仅更改第一个前缀. 我正在尝试一段时间,所以不要怪我愚蠢。

4

2 回答 2

5

如果您通读页面-exec部分,您将遇到允许您在. 这将允许您通过以下方式在比赛中使用:manfind{}-execrenamefind

find . -name 'file_*' -exec rename 's/file_/mywish_/' {} \;

从手册:

-执行命令

执行命令;如果返回 0 状态,则为 true。所有以下要查找的参数都被视为命令的参数,直到由;' is encountered. The string{}' 组成的参数被当前文件名替换,该文件名出现在命令的参数中,而不仅仅是在单独的参数中,如在某些版本的 find 中。这两种结构都可能需要转义(使用 `\')或引用以保护它们不被 shell 扩展。有关使用 -exec 选项的示例,请参见示例部分。指定的命令对每个匹配的文件运行一次。该命令在起始目录中执行。使用 -exec 操作存在不可避免的安全问题;您应该改用 -execdir 选项。

尽管您要求查找/执行解决方案,正如Mark Reed所建议的那样,您可能需要考虑将您的结果通过管道传输到xargs. 如果这样做,请确保使用-print0选项 withfind-0or-null选项,xargs以避免文件名中出现空格或 shell 元字符导致的意外行为。另外,考虑使用(也在手册中)的+版本,因为这是 POSIX 规范,因此如果您想在其他地方运行命令(并非总是如此),应该更便携;它还以类似于应该减少调用.-execfindxargsrename

于 2012-09-29T18:07:37.470 回答
0

不要以为只要找到就可以做到这一点,您需要创建一个脚本:

#!/bin/bash
NEW=`echo $1 | sed -e 's/file_/mywish_/'`
mv $1 ${NEW}

那么你就可以:

find ./ -name 'file_*' -exec my_script {} \;
于 2012-09-29T17:37:58.707 回答