web-dev-qa-db-ja.com

Bashの展開で「-」で始まるファイルが引数として渡されないようにするにはどうすればよいですか?

grepを使用して文字列を再帰的に検索しようとしていますが、次のようになります。

$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

Bashが-で始まるファイルを引数として渡さないようにするにはどうすればよいですか?

14
Chef Tony

最初に、ダッシュで始まる引数の解釈は、開始されるプログラム、grepなどによって異なることに注意してください。シェルにはそれを直接制御する方法はありません。

そのようなファイルを処理したい(それらを完全に無視しない)と仮定すると、grepは、ほとんどのプログラムと共に、--をオプションの終わりを示すものとして認識します。

grep -r -e "stuff" -- *

あなたがしたいことをします。 -eは、stuff-で始まる場合にも存在します。

または、次の方法も使用できます。

grep -r -e "stuff"  ./*

後者の場合も、現在のディレクトリに-というファイルがあった場合の問題を回避できます。 --セパレータの後でも、grep-をstdinと解釈し、./-は現在のディレクトリにある-と呼ばれるファイルです。

43
icarus

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" *
8
Isaac