在文件名上使用查找和执行命令时,不要加上"./"前缀。

在多个子目录中对文件名执行cp并以foo-为前缀会导致错误:
$ find my-dir -path "*/*" -execdir sh -c 'cp {} foo-{}' \;
cannot create regular file ‘foo-./blabla.jpg’: No such file or directory
在 macOS 上,我没有得到这个 `./` 前缀,命令正常工作。 有没有办法复制文件名而不带 `./` 前缀?
1个回答

即使在其他地方您的命令运行良好,它仍然存在缺陷。永远不要将{}嵌入到shell代码中。 正确的方法是:
find my-dir -path "*/*" -execdir sh -c 'cp -- "$1" "foo-${1#./}"' sh {} \;

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

注意事项:

  • 该命令不会检查匹配的whatever是否为文件。如果是目录,您将收到cp的警告。
  • 该命令不会检查foo-whatever是否存在以及其类型。如果存在,则根据它是文件还是目录以及它在whatever之前或之后处理的顺序,您将获得不同的结果。