对多个子目录中的文件名执行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
。