web-dev-qa-db-ja.com

アスタリスク(*)が前に付いているのに、一致するファイルがリストされないのはなぜですか?

Ubuntu 14.04, 64 bitで、/lib/modules/4.2.0-27-generic/kernel/driversを現在のディレクトリに設定しました。 netがサブ文字列として存在するすべてのファイルを検索するつもりです。正規表現を*net*で検索すると、./netディレクトリのみが検索結果として返されます。ただし、正確なファイル名を指定すると、関連するファイルがリストされるだけです(クロスチェックする正確なファイル名が常にわかっているとは限らないため、役に立ちません)。

$ find . -name *net* 
./net
$ find . -name *usbnet* 
./net/usb/usbnet.ko
$ pwd
/lib/modules/4.2.0-27-generic/kernel/drivers

私はどのような間違いを犯していますか?

3
Holmes.Sherlock

*net*だけを(引用符やエスケープなしで)使用すると、netコマンドが実行される前に、現在のディレクトリ内の(既存の)findファイル/ディレクトリとしてシェルによって展開されるためです。したがって、コマンドは次のようになります。

find . -name net

ご覧のとおり、netと一致しているだけなので、usbnet.koは一致しません。

また、引用符とエスケープを使用せずに、パターンが一致しない場合(および、nullglobオプションとfailglobオプションが無効になっている場合)、そのままとして扱われることにも注意してください。したがって、たとえば、find . -name *net*の場合、現在のディレクトリにnetを含むファイル名がない場合、パターン検索で取得されるのは*net*です。


したがって、問題を解決するには、シェルのグロブを回避する必要があります。そうするには、グロブパターンを引用またはエスケープすることができます。

find . -name '*net*' 
find . -name "*net*" 
find . -name \*net\* 
8
heemayl