我想从所有文件中取出 .hs。为什么这个命令不能正常工作?它留下相同名称的文件。
find . -type f -exec rename .hs ' ' * \;
答案1
代替:
find . -type f -exec rename .hs ' ' * \;
和:
find . -type f -exec rename .hs '' {} \;
在-exec
命令中,您希望文件名所在的位置应标有{}
.
另外,因为我猜测您想要.hs
删除而不是用空格替换,所以我们删除了单引号之间的空格。
文档
man find
包括该选项的解释-exec
:
-执行命令;
执行命令;如果返回 0 状态则为 true。 find 的所有以下参数都被视为命令的参数,直到;
遇到由以下组成的参数。 该字符串{}
将替换为命令参数中出现的当前正在处理的文件名,不仅仅是在单独使用它的参数中,如 find 的某些版本。这两种结构可能都需要转义(用\
)或引用,以保护它们免受 shell 的扩展。有关使用 -exec 选项的示例,请参阅示例部分。对于每个匹配的文件,指定的命令运行一次。该命令在起始目录中执行。使用 -exec 操作存在不可避免的安全问题;你应该使用该-execdir
选项。 [强调。]
答案2
使用Shell(Ksh、Bash、ksh93、mksh、zsh)模式替换扩展 ${var/Pattern/Replacement}
(第一场比赛图案, 之内变量替换为替代品。或者${var//Pattern/Replacement}
;全球替换。所有比赛图案, 之内变量替换为替代品。如果替代品被省略,那么匹配图案被替换为没有什么,即删除。)
find . -type f -exec bash -c 'echo mv "$1" "${1/.sh/}"' _ {} \;
Ps,删除echo
以重命名文件。