修复 find 命令路径中的空格

修复 find 命令路径中的空格

我想使用以下命令复制许多文件。

 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/

(这里使用Dglob 限定符,因此它也像find这样做一样包含隐藏文件,尽管您可能无论如何都想跳过它们)。

答案3

使用-print0withfind来以 null 终止文件名,并将此输出提供给xargswith-0以指示xargs标准输入中的文件名以 null 终止。并用于-I替换初始参数中的字符串。

find /Volumes/DATA/ -name '*.app' -maxdepth 1 -print0 | xargs -0 -I fn cp fn /Volumes/VMWare/img/

相关内容