-exec
が+
オプションを選択できることを理解していますxargs
の動作を模倣します。あるフォームを他のフォームよりも好む状況はありますか?
パイプの使用を避けるためだけに、個人的には最初のフォームを好む傾向があります。は適切な最適化を行っている必要があります。正解ですか?
回答
呼び出しを連鎖させて検索することをお勧めします(一度学んだら、それが可能であることがわかりました) 、今日かもしれません)。もちろん、これはあなたが見つけたままでいる間だけ可能です。 xargsにパイプすると、スコープ外になります。
小さな例、a.lstとb.lstの2つのファイル:
cat a.lst fuddel.sh fiddel.sh cat b.lst fuddel.sh
ここではトリックはありません-両方に「fuddel」が含まれているが、一方だけに「fiddel」が含まれているという事実。
それを知らなかったと仮定します。次の2つの条件に一致するファイルを検索します。
find -exec grep -q fuddel {} ";" -exec grep -q fiddel {} ";" -ls 192097 4 -rw-r--r-- 1 stefan stefan 20 Jun 27 17:05 ./a.lst
grepまたは別のプログラムが両方の文字列を条件として渡すための構文を知っているかもしれませんが、それは “重要ではありません。引数としてファイルを指定すると、trueまたはfalseを返すことができるすべてのプログラムをここで使用できます。grepは一般的な例にすぎません。
また、 find -exec と -ls または -delete など。削除はrm(ファイルを削除)だけでなく、rmdirも実行することに注意してください。 (ディレクトリを削除します)。
このようなチェーンは、特に指定されていない限り(つまり、-or
スイッチを使用して(およびparens(マスキングが必要)))。
つまり、検索チェーンを離れることはありません。これは便利なことです。 -xargsを使用する利点はありません。ファイルの受け渡しに注意する必要があるためです。これは、見つける必要がないことです。各ファイルの受け渡しを単一の引数として自動的に処理します。
{}中括弧を見つけるためにマスキングが必要だと思われる場合は、証拠を求める私の質問に気軽にアクセスしてください。私の主張は次のとおりです。
コメント
; "ただし、+(/プラス記号)が付いています。
回答
ファイル名をxargs
に安全にパイプするには、find
が
オプションと、xargs
には、それを読み取るための対応するオプションがあります(--null
または-0
)。それ以外の場合、unprintabを含むファイル名名前に文字、円記号、引用符、または空白を含めると、予期しない動作が発生する可能性があります。一方、find -exec {} +
は POSIX find
仕様に含まれています、したがって移植性があり、find -print0 | xargs -0
とほぼ同じくらい安全であり、find | xargs
よりも間違いなく安全です。 -print0
なしでfind | xargs
を実行することを絶対にしないことをお勧めします。
コメント
-
find … -exec … {} +
の移植性に対する注目すべき例外は、OpenBSDです。これは、2012年にリリースされたバージョン5.1でのみこの機能を取得しました。-print0
数年の間、OpenBSDでさえ(しばらくの間その機能に抵抗しましたが)。一方、SolarisはPOSIX機能に固執するため、と-print0
はありません。 -
-print0
は苦痛であり、議論することはできますがxargs --delimiter "\n"
は同等ではありません'私は'後者を発見した後、前者を一度も使用したことがありません。 - '
-0
が。 -
-0
に加えて、GNUxargs
入力がない場合にコマンドを実行しないようにするには-r
が必要です。' -
| xargs -r0 cmd
のもう1つの問題は、cmd
' s stdin影響を受けます(xargs
の実装に応じて、'の/dev/null
またはパイプ。
回答
-exec ... ;
フォームを使用する場合(覚えておいてくださいセミコロンをエスケープするには、「ファイル名ごとに1回コマンドを実行します。-print0 | xargs -0
を使用する場合は、ファイル名ごとに複数のコマンドを実行します。必ずフォーム。1つのコマンドラインに複数のファイルを配置し、多数のファイルが含まれる場合にはるかに高速になります。
xargs
は、xargs -P
を使用して複数のコマンドを並行して実行する機能です。マルチコアシステムでは、大幅な時間の節約になります。
コメント
- つまり
-P
の代わりに
-exec
の方法xargs -P4
4つのコアのうち3つがアイドル状態を維持しないようにしますか?