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