我有一个目录,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 错误。