特定のファイルセットのサイズを一覧表示するためにコマンドを使用しようとしていますが、出力は表示されませ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で終わります。いいえ。or
and
implicit ()
したがって、このコマンドは次のことをfind POD -type f -name *.mp3 -or -name *.ogg -ls
意味します。
- ファイル検索(PODディレクトリから開始)---ファイルが見つからない場合:停止
- else(ファイルが見つかりました)はパターンの一致を確認します
*.mp3
。 ---パターンが一致したら停止してください! (OR
ここから適用されるため、前のコマンドが失敗した場合にのみ適用されます。(ただし、前のコマンドのみが適用され、前のコマンドグループは適用されません)。
そして、コマンドラインに実行文( -ls
, -exec
, -print
....)を追加したので暗黙的なコマンドがないので、-print
1) 1)の条件がすべてtrue(ファイルとパターン一致)であれば何も実行する必要はありません。 。最後のエントリを削除すると、各条件付き分岐の終わりに-ls
暗黙的な展開が発生します。-print
- それ以外の場合、パターンが一致しない場合は、パターンに一致するもの(ファイル/ディレクトリ)を検索して一覧
*.ogg
表示します(これは-ls
条件付きコマンドではなく、前のコマンド/テスト「パターンがtrue」の場合にのみ実行されますが、*.ogg
1以降)、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
検索マニュアルページのセクションを参照してください。