「-exec cp{}dir+」を許可しないのはなぜですか?

「-exec cp{}dir+」を許可しないのはなぜですか?

名前またはで終わる多くのファイルをdir1含むディレクトリがあります。空のファイルをすべてコピーしたいです。.jpg.png.pngdir2

このコマンドの仕組み:

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は通常間違っています。

有名な最近の例:1989年にSVr4でも導入されたwaitid()は、終了コードのすべての32ビットが親プロセスで利用可能であることを定義します。 SUSv2規格(1997年以降)は、正確だが不明な理由から、将来のバージョンでは終了コードを0xFFでマスクする必要があると述べています。最近、これがPOSIXのバグであることが発見されました。

関連情報