ファイルの作成
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()は-a
OR()よりも優先順位が高くなります。-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