検索コマンドの出力が期待した結果を提供しません。

検索コマンドの出力が期待した結果を提供しません。

ファイルの作成

touch a1.txt a2.txt a3.txt
touch s1.mp3 s2.mp3 s3.mp3

だから私はやる

find . -name "*.txt" -or -type f -print

そして、なぜファイルs1.mp3 s2.mp3 s3.mp3が表示されないのですか?.txt

答え1

演算子の優先順位のため:絶対的なAND間のAND()は-aOR()よりも優先順位が高くなります。-type f-print-o

find . \( -name "*.txt" \) -or \( -type f -print \)

欲しいかもしれないけど

find . \( -name "*.txt" -or -type f \) -print

すべてのファイルを印刷します。

答え2

優先順位の指定は答えの半分に過ぎません。重要なのは、ブール式の完成ルールがどのように機能するかです。これはfind合理的なデフォルト値を使用し、同時にプログラム可能であるため、少し複雑になります。

私が意味するものを説明するために、ここに別の解決策があります。

find . -name "*.txt" -print -or -type f -print

これは明確なものを追加します行動最後まで。のみ:

]# find -name "*.txt" -or -type f
./p.txt
./s1.mp3
./a1.txt

また、すべてのファイルをインポートします(通常ではない「p.txt」エントリを含む)。ここでのデフォルト値は-print(サブ)式の外側にあり、すべてのブランチに適用されます。

正確に1つだけ追加すると、-print「either ... or」と表示されます。

]# find -name "*.txt" -print -or -type f 
./p.txt
./a1.txt

]# find -name "*.txt" -or -type f -print
./s1.mp3

どちらが良いと議論する必要はありません。問題は、Qが非常に人為的で反復的であるということです。を追跡する場合は、mkfifo pipe.txt「OR」の代わりに論理的な「AND NOT」が意味論的に(そして全体的に)さらに意味があります。

これには括弧や-printは必要ありません。

]# find -name "*.txt" -not -type f       
./p.txt

関連情報