-Exec在find命令中缺少参数(\;和+之间的差异)

时间:2019-02-17 11:26:33

标签: bash shell find arguments exec

首先,我阅读了相关主题,但是没有一个主题解释了我的疑问。

我有一个下面的命令可以正常工作:

find ./source/ -maxdepth 1 -type f ! -name "secretinfo.md" -exec cp {} ./build/ \;

但是,使用;意味着我将每个找到的文件一个一个地传递给cp命令。我以为我可以一次通过cp命令允许它们全部通过。根据我发现的其他answear:

  

-exec命令必须以;结尾; (因此您通常需要   键入\;要么 ';'以避免被shell解释)或+。的   区别在于,使用;,每个文件调用一次命令,使用   +,它被调用的次数越少越好(通常一次,但是命令行有最大长度,因此可能会被分割)   所有文件名

因为那是我所做的:

find ./source/ -maxdepth 1 -type f ! -name "secretinfo.md" -exec cp {} ./build/ +

在这里我得到一个错误:

find: missing argument to `-exec'

您能告诉我为什么不允许这样做吗?

1 个答案:

答案 0 :(得分:1)

+可以,但是您在exec中使用参数不正确。

您可以尝试:

find ./source/ -maxdepth 1 -type f ! -name "secretinfo.md" -exec bash -c 'cp $@ ./build/' - {} +

find ./source/ -maxdepth 1 -type f ! -name "secretinfo.md" -exec cp --target-directory=./build/ {} +

尽管可能不是靠满足,why的原因是这样的because it is supposed to;在man find中,您可能会看到:

  

-exec命令{} +

,您可能会注意到该命令在{} +之前( )。

我必须说,我不知道为什么要这样指定(似乎是posix:http://pubs.opengroup.org/onlinepubs/009695399/utilities/find.html

另请参见

Solution to error 'find: missing argument to -exec' with find -exec cp {} TARGET_DIR +

有关其他示例,请参见find: missing argument to -exec