GNU/Linux >> Linux の 問題 >  >> Linux

複数の`-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)を使用する

承認された回答:

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

の略:

find . ( ( -type f -a -name "*.htm*" ) -o 
          ( -name "*.js*" ) -o 
          ( -name "*.txt" ) 
       ) -a -print

つまり、アクションがないためです。 述語が指定されています(条件のみ )、-print 条件に一致するファイルに対してアクションが暗黙的に追加されます。

(ちなみに、それは非正規の.jsを出力します ファイル(-type f .htmにのみ適用されます ファイル))。

一方:

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

の略:

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

findの場合 (多くの言語のように)、 AND -a;省略した場合は暗黙的) ORよりも優先されます (-o )、および明示的なアクション述語を追加します(ここでは-exec-printをキャンセルします 上記の暗黙のアクション。ここで、必要なもの:

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

または:

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

1つのshの実行を回避するには ファイルごと。


Linux
  1. ファイルを移動して進行状況を表示する方法(例:プログレスバーを使用)?

  2. $ _対!$。前のコマンドと出力リダイレクトの最後の引数?

  3. 複数のホームフォルダをDropboxおよびSymlinksと同期しますか?

  1. CloudCross –ファイルとディレクトリを複数のクラウドストレージと同期する

  2. vsish コマンドで情報を取得する (esxi のみ)

  3. 同じサブネット上の IP を持つ複数の物理インターフェイス

  1. Linuxlogrotateコマンドを使用してログをローテーションおよびアーカイブします

  2. 複数のパターンでGrepを実行する方法は?

  3. 巨大なログ ファイル (>14 GB) で最後の x GB のみを grep しますか?