グロビングはシェルの機能ですか?


12

私はこれこのような多くの質問と回答を読みました

ワイルドカードは、コマンドを実行する前にシェルによって展開され、シェルの機能であることがわかります。また、ワイルドカードは、多くの引数を受け入れることができるコマンドで機能します。ではfind . -name *.rb 、我々は現在のディレクトリに複数のファイルを持っている場合find:検索は、複数の引数を受け入れることができないと、これを解決する方法があるので、私たちにエラーを与えます

find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb

アスタリスクをエスケープし、シェルによる展開を防ぎますが、ワイルドカードはシェルの機能です。アスタリスクをエスケープすると、シェルはその意味を認識せず、という名前のファイルを見つけるはず*.rbです。この場合、アスタリスクはどのように展開されますか?

回答:


21

はい。シェル*は、ディレクトリ内の*.rb任意の文字を含むすべてのファイル.rb、および任意の文字と末尾のを含むすべてのファイルとして認識し、そのように展開します。

findコマンド自体はグロブ受け付けます。

あなたが引用していない場合*、シェルはそれを拡大する前に、findコマンドは、引数、その代わりのグロブ見*.rbに渡されfind、に渡されるディレクトリ内のグロブに一致するすべてのファイルの名前をfind、そしてfindそれらを解釈しようとします引数として、おそらくエラーになるか、少なくともあなたが望むものではありません(現在のディレクトリに一致するファイルがない場合にのみ正しく動作します)


ありがとう、それはシェルにそれがグロブではないが、いくつかのコマンドはワイルドカードを展開できると言うことを意味しますか?または、グロビングについて理解していないシェルがある場合、それらのコマンドがグロビングによってコマンドを展開できることを知っていると言えますか?
シノッシュ

5
*が引用されている場合、シェルはそれを展開せず、グロブを含む引数は、グロブを理解できるコマンドに渡されます
Zanna

1
私の喜び^ _ ^
ザンナ

7
@Sinoosh:すべてのコマンドがグロブ構文を理解するわけではないことに注意してください。それはたまたまの機能であるfind
slebetman

1
@Sinoosh Findは実際にはワイルドカードを「拡張」するのではなく、検出した各ファイル名と一致するテストとして使用します。従来の意味でワイルドカードを展開する(ごく少数の)コマンドがあります[archive filename single argument] [list of files to extract]。たとえば、unzipおよび7zを使用して複数のアーカイブを開くことができます(引数が通常 " "の場合)。
Random832
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.