この部分 " ( -name *txt -o -name *html ) " は、コードで私を混乱させます:
find $HOME \( -name \*txt -o -name \*html \) -print0 | xargs -0 grep -li vpn
誰かが括弧と「-o」を説明できますか? 「-o」はコマンドですか、それともパラメータですか? 角かっこが "\" でエスケープされていることは知っていますが、なぜですか?
この部分 " ( -name *txt -o -name *html ) " は、コードで私を混乱させます:
find $HOME \( -name \*txt -o -name \*html \) -print0 | xargs -0 grep -li vpn
誰かが括弧と「-o」を説明できますか? 「-o」はコマンドですか、それともパラメータですか? 角かっこが "\" でエスケープされていることは知っていますが、なぜですか?
デフォルトでは、検索引数リストの条件は「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 に感謝します。
「-o」は OR を意味します。つまり、名前は「txt」または「html」で終わる必要があります。括弧は、2 つの条件をグループ化するだけです。
( および ) は、find コマンドの検索パラメーターをグループ化する方法を提供します。-o は「or」演算子です。
この検索コマンドは、「txt」または「html」で終わるすべてのファイルを検索し、それらを引数として grep コマンドに渡します。