为什么 find 不接受“-exec cp {} dir +”?

为什么 find 不接受“-exec cp {} dir +”?

我有一个目录,dir1其中包含许多名称以 或 结尾的.jpg文件.png。我想复制所有空.png文件。dir2

该命令的工作原理:

find dir1 -name '*.png' -exec cp {} dir2 \;

但这个命令不会:

find dir1 -name '*.png' -exec cp {} dir2 +
find: missing argument to `-exec'

我也尝试过:

find dir1 -name '*.png' -exec cp {} -t dir2 +
find: missing argument to `-exec'

和:

find dir1 -name '*.png' -exec cp {} dir2 \+
find: missing argument to `-exec'

看完之后这一页,我什至尝试过:

find dir1 -name '*.png' -exec cp {} dir2 {} +
find: Only one instance of {} is supported with -exec ... +

这一页说:

-exec {} + 于 2005 年在 [版本] 4.2.12 中添加

我的版本find是4.4.2。

我究竟做错了什么?

答案1

感谢“steeldriver”,我发现答案是因为 POSIX 规范禁止在 之间{}+之后出现任何内容-exec

答案2

当然有一个符合 POSIX 标准的解决方案来解决这个问题:

find dir1 -name '*.png' -exec sh -c 'cp "$@" dir2' null {} +

无需使用非标准供应商特定功能。

顺便说一句:据我所知,execplus 功能是 David Korn 于 1989 年在 SVr4 工作时引入的。一个重要的背景信息是:POSIX 不定义新功能,而只是标准化现有的解决方案,因此,如果 POSIX 标准与主要解决方案发生冲突,POSIX 通常是错误的。

最近有一个突出的例子:waitid() 也是由 SVr4 于 1989 年引入的,它定义退出代码中的所有 32 位必须可供父进程使用。 SUSv2 标准(从 1997 年开始)是正确的,但由于未知的原因,后来的版本提到退出代码必须用 0xFF 屏蔽。最近发现这是一个 POSIX 错误。

相关内容