对不带“./”前缀的文件名使用 find 并执行命令

对不带“./”前缀的文件名使用 find 并执行命令

对多个子目录中的文件名执行cp并在其前面加上foo-会导致错误:

$ find my-dir -path "*/*" -execdir sh -c 'cp {} foo-{}' \;
cannot create regular file ‘foo-./blabla.jpg’: No such file or directory

在 macOS 上我没有得到这个./前缀并且命令运行正常。

有没有办法使cp文件名不带./前缀?

答案1

即使您的命令在其他地方运行良好,但它仍然存在缺陷。切勿嵌入{}shell 代码

正确的做法是:

find my-dir -path "*/*" -execdir sh -c 'cp -- "$1" "foo-${1#./}"' sh {} \;

where${1#./}负责删除前导字符./(如果有的话)。注意我使用了双划线find,当生成带有前缀的名称时,这是不必要的(但无害)./,但在其他情况下很有用。

笔记:

  • 该命令不检查匹配项是否为文件。如果匹配项为目录,whatever您将收到警告。cp
  • 该命令不会检查是否foo-whatever存在以及它是什么。如果存在,您将获得不同的结果,具体取决于它是文件还是目录;并且取决于它是在之前还是之后处理的whatever

相关内容