「grep -r foo *」対「grep -r foo」


10

grep -rを使用すると、*または。のいずれかを使用してすべてのファイルを検索できます。同じものを返すようですが、本当に同じですか?

「foo」を検索するとすると、次のように書くことができます

grep -r foo *

または

grep -r foo .

誰もが違いを説明しようとするだろうか。そして*?

回答:


15

grep -r foo *隠しファイルまたは隠しディレクトリで一致を検索しません。また*、シェルによって展開されるため、現在のディレクトリに多くのエントリがある場合、引数リストが長すぎるというエラーが発生する可能性があります。一部のファイルまたはディレクトリの名前はダッシュ文字で始まります。

呼び出しにgrep -r foo .は上記の欠陥は​​ありません

更新しました:

別の違い:grepのmanページ(@ fedora17)はこう言っています:

-r, --recursive
    Read all files under each directory, recursively, following symbolic links only if they
    are on  the  command  line.  ...

空のディレクトリでこのコマンドを実行する場合にも違いがあります。

$ grep -r foo *; echo $?
grep: *: No such file or directory
2
$ grep -r foo .; echo $?
1
$

4

アスタリスクを使用する場合、のように名前がドットで始まるディレクトリ内のファイルと一致させることはできません.cache

更新:

これは、*がを呼び出す前にシェルによって展開されるため、grep(現在のの.)単一のディレクトリ名ではなく、名前のリストを受け取るためです。パターンを展開する方法シェルは(と同様にシェルパラメータでカスタマイズすることができるnullglobnocaseglobまたは他のbash(のような環境変数をオプション)またはであるLANG又はLC_ALL

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.