ファイル検索での*の使用


9

Linuxファイルの検索について読んでいる間、私は以下を得ました...

*ワイルドカードを使用してファイルを検索するには、不明な文字列を*に置き換えます。たとえば、拡張子が.outだったことだけを覚えている場合は、ls * .outと入力します。

そして私がシステムで次のコマンドを試したとき(ubuntu 14.04 LTS)..私は得ました

anupam@JAZZ:~$ ls  *.bash* 

ls: cannot access  *.bash* : No such file or directory

anupam@JAZZ:~$ ls  .bash*

.bash_history   .bash_logout  .bash_profile  .bashrc

anupam@JAZZ:~$

最初のケースでは*.bash*、そのようなディレクトリが表示されない理由()、次のケースでは、ファイル(.bash*)が表示されます

私はこのフレーバーが初めてで、オートマトン理論のクラス(*)によると、イプシロン(空)を含む文字列の任意の組み合わせを意味します。

回答:


11

実行ls *する*と、に渡されるに展開されlsます。それは我々が3つのファイル(があれば言うことですabそしてcディレクトリ内)をls *実際に実行されていますls a b c

Bashが展開できない場合、生の文字列を通過します¹。そのため、エラーにワイルドカードと、見つからないメッセージが表示されます。ls文字通りと呼ばれるファイルのリストを表示しようとしました*.bash*

それで、なぜそれが拡大しなかったのですか?デフォルトでは、グロビング(このワイルドカード拡張と呼ばれるもの)は隠しファイルを返しません。これを変更することができshopt -s dotglobます(固定しない限り持続.bashrcしません—正当な理由でデフォルトで無効になっている可能性があるため、注意してください)。以下に簡単なデモを示します。

$ ls  *.bash*
ls: cannot access *.bash*: No such file or directory
$ shopt -s dotglob
$ ls  *.bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

これの例外は、すでに示したように、すでに明示的に述べた場合、ファイルはのようなパターンで非表示になること.bash*です。それは単にデフォルトdotglob設定を上書きします:

$ shopt -u dotglob  # unset dotglob
$ ls .bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

とにかく、その奇妙なことに加えて、これが表面下で何が起こっているのかを理解するのに役立つことを願っています。


他のありshopt作品をグロブ方法を変更フラグは:extglobfailglobglobstarnocaseglobnullglob。それらと他の多くのshoptフラグはBashマニュアルの一部として文書化されています

同様に、パターンマッチングのページも参考になります。

failgloborまたはnullglobが設定されていない場合。


thanx @Oli ,,私はこのフレーバーが初めてだと言ったので、それらすべてを手に入れることはできませんでしたが、その80%を得ました...それは私を助けました
lazarus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.