6

この部分 " ( -name *txt -o -name *html ) " は、コードで私を混乱させます:

find $HOME \( -name \*txt -o -name \*html \) -print0 | xargs -0 grep -li vpn

誰かが括弧と「-o」を説明できますか? 「-o」はコマンドですか、それともパラメータですか? 角かっこが "\" でエスケープされていることは知っていますが、なぜですか?

4

3 に答える 3

8

デフォルトでは、検索引数リストの条件は「and」で結合されます。-oオプションは「または」を意味します。

あなたが書いた場合:

find $HOME -name \*txt -o -name \*html -print0

その場合、「txt」で終わるファイル名に関連付けられた出力アクションがないため、出力されません。name オプションを括弧でグループ化すると、「html」ファイルと「txt」ファイルの両方が得られます。


例を考えてみましょう:

mkdir test-find
cd test-find
cp /dev/null file.txt
cp /dev/null file.html

以下のコメントには、これに関する興味深いサイドライトがあります。コマンドが次の場合:

find . -name '*.txt' -o -name '*.html'

次に、どちらの選択肢にも明示的なアクションが指定されていないため、デフォルトの-print( -print0! ではない) アクションが両方の選択肢に使用され、両方のファイルがリストされます。-print選択肢の 1 つ (他の選択肢ではなく) の後に または他の明示的なアクションがある場合、そのアクションを伴う選択肢のみが有効になります。

find . -name '*.txt' -print -o -name '*.html'

これは、さまざまな選択肢に対してさまざまなアクションを実行できることも示唆しています。変更時間など、他の条件を適用することもできます。

find . \( -name '*.txt' -o -name '*.html' \) -mtime +5 -print0

find . \( -name '*.txt'  -mtime +5 -o -name '*.html' \) -print0

最初の例では、5 日以上前の txt または html ファイルが出力されます (したがって、サンプル ディレクトリについては何も出力されません。ファイルは数秒前のものです)。2 つ目は、5 日以上経過した txt ファイルまたは任意の経過時間の html ファイル (つまり、file.html のみ) を出力します。等々...

この追加につながるコメントをくれた DevSolar に感謝します。

于 2009-03-12T05:44:32.057 に答える
3

「-o」は OR を意味します。つまり、名前は「txt」または「html」で終わる必要があります。括弧は、2 つの条件をグループ化するだけです。

于 2009-03-12T05:21:30.850 に答える
2

( および ) は、find コマンドの検索パラメーターをグループ化する方法を提供します。-o は「or」演算子です。

この検索コマンドは、「txt」または「html」で終わるすべてのファイルを検索し、それらを引数として grep コマンドに渡します。

于 2009-03-12T05:22:27.290 に答える