複数の '-name' と '-exec' を持つ 'find' は、最後に表示される '-name' のみを実行します。

複数の '-name' と '-exec' を持つ 'find' は、最後に表示される '-name' のみを実行します。

私が使うとき

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"

あらゆる種類のファイルを探します。しかし、-exec最後に追加すると、次のようになります。

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} \;

.txtファイルだけを印刷しているようです。私は何が間違っていましたか?

注:MINGW(Git Bash)を使用してください。

ベストアンサー1

探す。 -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"

略語は次のとおりです。

探す。'('\
           '('-f タイプ-ㅏ- 名前 "*.htm*"')'- モールド\
           '('- 名前 "*.js*"')'- モールド             \
           '('- 名前 "*.txt"')'\
       ')' -印刷

つまり、ないからだ。行動述語が指定されました(のみ状況)、-print基準を満たすファイルの操作を暗黙的に追加します。

(しかし、これを行うと、非正規.jsファイルが印刷されます(ファイル-type fでのみ機能します.htm)。

しかし:

探す。 -name "*.htm*" -o -name "*.js*" -o -name "*.txt"\
  -exec sh -c 'echo "$0"' {}\;

略語は次のとおりです。

探す。'('-f タイプ-ㅏ- 名前 "*.htm*"')'- モールド\
       '('- 名前 "*.js*"')'- モールド\
       '('- 名前 "*.txt"-ㅏ-exec sh -c 'echo "$0"' {}\;')'

(多くの言語と同様findそして-a;省略時の暗黙的)が優先されます。または-o)、明示的な演算述語(ここ-exec)を追加すると、-print上から見た暗黙の演算がキャンセルされます。

希望する場所は次のとおりです。

find . '(' -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ')' \
       -type f \
       -exec sh -c 'echo "$0"' {} \;

または:

find . '(' -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ')' \
       -type f \
       -exec sh -c '
         for i do
           echo "$i"
         done' sh {} +

shファイルごとに1つずつ実行しないでください。

-type fインデックスノードから情報を取得するよりもコストがかかる-nameため後ろにいくつかfindの実装では、最適化のために内部的に並べ替えチェックを実行しますが)。

おすすめ記事