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

при чтении о поиске файла 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* )

Я плохо знаком с этой разновидностью, и согласно моим классам теории автоматов (*) означает какую-либо комбинацию строк включая (пустой) эпсилон, Итак, почему результаты отличаются в обоих случаи....?

9
задан 3 September 2014 в 13:24

1 ответ

Когда Вы делаете ls * * расширяется, прежде чем это будет передано ls. То есть, если у нас есть три файла (a, b и c) в каталоге ls * на самом деле работает ls a b c.

Когда Bash не может расшириться, он проходит через необработанную строку ¹. Вот почему Вы видите подстановочные знаки по ошибке, наряду с не найденным сообщением. ls попробованный для показа списка для файла, буквально названного *.bash*.

Итак, почему это не расширилось? Хорошо по умолчанию globbing (чем называют это подстановочное расширение) не возвратит скрытые файлы. Можно изменить это с 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 флаги, которые изменяются, как globbing работает: extglob, failglob, globstar, nocaseglob и nullglob. Они и плот другого shopt флаги документируются как часть руководства Bash.

Точно так же страница на Сопоставлении с образцом должна сделать для некоторого хорошего чтения.

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

11
ответ дан 16 November 2019 в 16:17

Другие вопросы по тегам:

Похожие вопросы: