37

ファイル操作を行うためのワイルドカードを見つけようとしています。

テスト目的で、これらのファイルをディレクトリに置いています。

file_BSD.GIF  file_linux.gif  file_unix

私のlsコマンドを参照してください。

$ ls *{.GIF,.gif}
file_BSD.GIF  file_linux.gif

どちらでも構いません。

しかし、「検索」は同じようには機能しないようです。

$ find -name *{.GIF,.gif}
find: paths must precede expression: file_linux.gif
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

ちなみに、「-iname」は大文字と小文字の両方のファイルを見つける必要があることを読みましたが、それも機能しないようです。

$find -iname *.gif

./file_linux.gif

(これにより、.GIFファイルも検索されますよね?)

4

3 に答える 3

57

find -name *{.GIF,.gif}間違っている。

このコマンドは、最初にシェルによって次のように展開されます。find -name *.GIF *.gif

その後、さらに拡張されます:

find -name file_BSD.GIF  file_linux.gif 
# as you have only these files in directory

これ-name file_BSD.GIF file_linux.gifがに渡されfindます。そして、これは間違っfile_linux.gifています。findによって受け入れられるようなスイッチがないからです。

必要なのはこのコマンドです。

find -name '*.GIF' -or -name '*.gif'

.gif大文字と小文字を区別しない方法でファイルを収集する場合、このfindコマンドは次のようになります。

find -iname '*.gif'

ここで一重引用符(')に注意してください。これは、シェルを拡張せずにそのまま検索するために送信する必要があることを意味ます*.GIF。そして、findはこれをパターンとして使用します。シェルのメタ文字をエスケープしない限り、この一重引用符が必要です。その場合、コマンドは次のようになります。

find -iname \*.gif
于 2012-11-16T20:26:20.823 に答える
12

に与えるパターンを引用する必要があるため、のパラメータ-inameに問題があります。find

したがって、次のことを行う必要があります。

find -iname '*.gif'

これはマニュアルに記載されています:

「...当然のことながらパターンを引用する必要があることに注意してください。引用しないと、シェルがパターン内のワイルドカード文字を展開してしまいます。」

于 2012-11-16T20:28:05.183 に答える
4

(Windowsとは対照的に)シェルがプログラム*{.GIF,.gif}に渡す前に拡張していることを理解する必要がありfindます。

プログラムをに置き換えることで、シェルが何をするかを感じることができますecho

したがって、プログラムの引数を引用する必要があります。

   echo \-name '*{.GIF,.gif}'

実行します

   find -name '*.{GIF,gif}'

多分あなたが欲しい

   find -name '*.gif' -o -name '*.GIF'

Advanced Bash Scripting Guide (および、カーネルがプログラムを実行する方法を理解するには、おそらくexecve(2)のマニュアルページ)をお読みください。

于 2012-11-16T20:28:30.653 に答える