在没有“./”前缀的文件名上使用 find 和 do 命令

Erw*_*ers 3 linux bash command-line find string-manipulation

cp对多个子目录中的文件名执行 a并foo-为其添加前缀会导致错误:

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

在 macOS 上,我没有得到这个./前缀,而且命令工作正常。

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

Kam*_*ski 5

即使您的命令在其他地方运行良好,它仍然存在缺陷。永远不要嵌入{}到 shell 代码中

正确的做法是:

find my-dir -path "*/*" -execdir sh -c 'cp -- "$1" "foo-${1#./}"' sh {} \;
Run Code Online (Sandbox Code Playgroud)

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

笔记:

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