特定の検索では検索操作を使用できません。

特定の検索では検索操作を使用できません。

特定のファイルセットのサイズを一覧表示するためにコマンドを使用しようとしていますが、出力は表示されませfindん。私が使用するコマンドは次のとおりです。

find POD -type f -name *.mp3 -or -name *.ogg -ls

出力は生成されません。しかし:

find POD -type f -name *.mp3 -or -name *.ogg

出力を生成する場合は、次も試しました。

-printf "%p %k KB\n"
-exec ls -ls '{}' \;
-print0

ただし、これらすべてに出力はありません。たとえば、次のようなさまざまな表現でこれらの操作を使用する場合:

find . -maxdepth 1 -type f -printf "%p %k KB\n"

私も期待される結果を得ます。何が問題なのかご存知ですか?私は走っています:

Linux irimi 3.10.37-1-MANJARO #1 SMP Mon Apr 14 20:56:29 UTC 2014 x86_64 GNU/Linux

最新の Manjaro Linux ディストリビューションとも呼ばれます。私が使用するシェルは/bin/bashバージョンです4.3.8(1)-release

SHELLOPTS私の環境変数の内容は次のとおりです。

braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

私のBASHOPTS環境変数は次のとおりです。

cdspell:checkwinsize:cmdhist:complete_fullquote:dotglob:expand_aliases:extglob:extquote:force_fignore:histappend:hostcomplete:interactive_comments:nocaseglob:progcomp:promptvars:sourcepath

もう一度申し上げますが、この問題をデバッグするのを手伝ってくれてありがとう。

答え1

罠があるそして/またはにキーワードがありますfind。タスク(例では)orを含む、以下のすべてのパラメータに適用されます。-lsない(または追加された)式はand読み取り順序で評価され、falseで終わります。いいえ。orandimplicit ()

したがって、このコマンドは次のことをfind POD -type f -name *.mp3 -or -name *.ogg -ls意味します。

  • ファイル検索(PODディレクトリから開始)---ファイルが見つからない場合:停止
  • else(ファイルが見つかりました)はパターンの一致を確認します*.mp3 。 ---パターンが一致したら停止してください! (ORここから適用されるため、前のコマンドが失敗した場合にのみ適用されます。(ただし、前のコマンドのみが適用され、前のコマンドグループは適用されません)。

そして、コマンドラインに実行文( -ls, -exec, -print....)を追加したので暗黙的なコマンドがないので、-print1) 1)の条件がすべてtrue(ファイルとパターン一致)であれば何も実行する必要はありません。 。最後のエントリを削除すると、各条件付き分岐の終わりに-ls暗黙的な展開が発生します。-print

  • それ以外の場合、パターンが一致しない場合は、パターンに一致するもの(ファイル/ディレクトリ)を検索して一覧*.ogg表示します(これは-ls条件付きコマンドではなく、前のコマンド/テスト「パターンがtrue」の場合にのみ実行されますが、*.ogg1以降)、2)はmp3以外のファイルに対してのみ評価され、ファイルがなければ.ogg何も表示されません。

ソリューション1 各論理分岐でコマンドを繰り返します。

   find POD -type f -name "*.mp3" -ls -or -name "*.ogg" -ls

ソリューション2(シェル保護)ブラケットの追加

   find POD -type f \( -name "*.mp3" -ls -or -name "*.ogg" \) -ls

ノート 現在のディレクトリでシェルパターンを評価しないようにするには、パターンを保護する必要があります。

答え2

私はこれが評価順(明確な優先順位不足)のためだと思います。

-name '*.mp3' -o -name '*.ogg' -ls

これにより、-name '*.ogg'評価結果が false の場合、ls操作は実行されません。括弧を使用して OR 式をグループ化すると、目的の動作を取得できます。たとえば、次のようになります。

$ ls tests
file1.mp3  file2.mp3  file3.mp3

それから

$ find tests \( -name '*.mp3' -o -name '*.ogg' \) -print
tests/file3.mp3
tests/file1.mp3
tests/file2.mp3

しかし、

$ find tests -name '*.mp3' -o -name '*.ogg' -print

出力は生成されません。気づく

$ find tests -name '*.mp3' -o -name '*.ogg'

暗黙的に次のように扱われるので特別なケースです。

$ find tests \( -name '*.mp3' -o -name '*.ogg' \) -print

findまた、シェルの拡張を防ぐために、コマンドでシェルグローバル変数を引用またはエスケープすることをお勧めします。NON-BUGS検索マニュアルページのセクションを参照してください。

関連情報