我想使用以下命令复制许多文件。
cp `find /Volumes/DATA/ -name "*.app" -depth 1 2> /dev/null` /Volumes/VMWare/img/
但这不起作用,因为如果它找到一个空格,那么它会将其解释为订单的结尾。
如何解决这个问题?
答案1
首先,find 可以对其结果做一些事情;看看-exec {}
国旗。你可以这样做:
find /Volumes/DATA/ -name "*.app" -depth 1 2> /dev/null -exec cp '{}' /Volumes/VMWare/img/ \;
请注意文件占位符“{}”周围的单引号。
您还可以使用带有 xargs 的管道。
答案2
在 中zsh
,`...`
就像现代形式一样,$(...)
根据 的字符进行分割$IFS
,默认情况下包括 SPC、TAB、NL 和 NUL。
其中,只有 NUL 不能出现在文件路径中,因此您需要:
IFS=$'\0'
cp $(find /Volumes/DATA/ -name "*.app" -depth 1 -print0 2> /dev/null) /Volumes/VMWare/img/
$(...)
或者,不使用通过全局参数完成的隐式分词,而是使用显式拆分运算符:
cp ${(0)"$(find /Volumes/DATA/ -name "*.app" -depth 1 -print0 2> /dev/null)"} /Volumes/VMWare/img/
但无论如何,find
在这里使用没有任何好处:
cp /Volumes/DATA/*.app(D) /Volumes/VMWare/img/
(这里使用D
glob 限定符,因此它也像find
这样做一样包含隐藏文件,尽管您可能无论如何都想跳过它们)。
答案3
使用-print0
withfind
来以 null 终止文件名,并将此输出提供给xargs
with-0
以指示xargs
标准输入中的文件名以 null 终止。并用于-I
替换初始参数中的字符串。
find /Volumes/DATA/ -name '*.app' -maxdepth 1 -print0 | xargs -0 -I fn cp fn /Volumes/VMWare/img/