использование * в поиске файлов

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 **lsabcls *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флаги , которые изменяют , как подстановка работы: extglob, failglob, globstar, nocaseglobи nullglob. Они и множество других shoptфлагов задокументированы как часть руководства Bash .

Точно так же, страница « Сопоставление с образцом» должна быть полезной для чтения.

¹ Если failglobили nullglobне установлены.

Оли
источник
спасибо @Oli ,, я не получил все это, как я уже говорил, я новичок в этом вкусе ,, но я получил 80% от этого ... Это помогло мне
Лазарь