grep
を使用して文字列を再帰的に検索しようとしていますが、次のようになります。
$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Bashが-
で始まるファイルを引数として渡さないようにするにはどうすればよいですか?
最初に、ダッシュで始まる引数の解釈は、開始されるプログラム、grep
などによって異なることに注意してください。シェルにはそれを直接制御する方法はありません。
そのようなファイルを処理したい(それらを完全に無視しない)と仮定すると、grep
は、ほとんどのプログラムと共に、--
をオプションの終わりを示すものとして認識します。
grep -r -e "stuff" -- *
あなたがしたいことをします。 -e
は、stuff
が-
で始まる場合にも存在します。
または、次の方法も使用できます。
grep -r -e "stuff" ./*
後者の場合も、現在のディレクトリに-
というファイルがあった場合の問題を回避できます。 --
セパレータの後でも、grep
は-
をstdinと解釈し、./-
は現在のディレクトリにある-
と呼ばれるファイルです。
Bash展開が「-」で始まるファイルを渡さないようにするには、次のコマンドを使用できます。
echo [!-]*
ほとんどのシェル、またはksh、bash、zshに固有の移植性のある方法で動作します。
echo !(-*)
例:このファイルがあるディレクトリ
$ echo *
a b c ---corporate-discount.csv d -e --option.txt
リストのみ(extglob
がアクティブな場合):
$ shopt -s extglob
$ echo !(-*)
a b c d
$ echo [!-]*
a b c d
ただし、-
で指定されたファイルをオプションとして解釈しないようにgrepに指示しながらすべてのファイルを処理する場合は、./
を追加するだけです。
grep -r "stuff" ./*
または、正確に-
というファイルがリストされたファイルに存在しないことが保証されている場合(grepは、孤独な-
をread from stdinと解釈します)、次のように使用できます。
grep -r -- "stuff" *