Бах Глобстар

У меня есть эта структура каталогов:

~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext 

и, с globstar опцией globstar в Bash, я могу сказать:

 ~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext 

Мой вопрос: почему в этом списке исключен dir/file.ext ?

В руководстве Bash говорится о globstar :

Если установлено, шаблон '**', используемый в контексте расширения имени файла, будет соответствовать всем файлам и нулям или каталогам и подкаталогам. Если за шаблоном следует '/', совпадают только каталоги и подкаталоги.

« Zero » в этом абзаце позволяет мне dir/file.ext впечатление, что dir/file.ext должен был быть включен; если я, надеюсь, ничего не упустил.

3 Solutions collect form web for “Бах Глобстар”

Я предполагаю, что это относится только к уровню подкаталога. ** без / матчей

  1. все файлы и каталоги

  2. ноль или более подкаталогов

Но он не исчезает полностью. **/ означает, что файлы в каталоге верхнего уровня, к которому применяется ** не совпадают.

Вам нужен dir/*.ext dir/**/*.ext .

Это работает так, как вы ожидали в этих версиях Bash, как указано в перечисленных дистрибутивах:

  • 4.1.2 (1) – CentOS 6.5
  • 4.1.5 (1) – Debian 6.0.10
  • 4.1.10 (4) – Cygwin 1.7.31
  • 4.2.46 (1) – CentOS 7.1
  • 4.3.11 (1) – Ubuntu 14.04.1
  • 4.3.30 (1) – Debian 8.1

Фактически перечисленные выше версии – это все, что я тестировал. Другими словами, я не нашел версию 4 Bash, где она не работает. Параметр globstar был добавлен в Bash 4.0, см. CHANGES . В старых версиях команда shopt -s globstar должна возвращать ошибку.

тесты

1. dir/**/*.ext dir/file.ext соответствует dir/file.ext :

 ~/tests$ ls -1 dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext 

2. **/*.ext file.ext соответствует file.ext :

 ~/tests$ cd dir ~/tests/dir$ ls -1 **/*.ext file.ext subdir1/file.ext subdir2/file.ext 

Подготовка среды для воспроизведения вышеперечисленных тестов:

 mkdir -p dir/subdir{1,2} touch dir/{,subdir{1,2}/}file.ext shopt -s globstar 

Я смотрю на меня так, как будто у вас / выключен globstar. Его можно включить следующим образом:

 shopt -s globstar 

Он не только не будет соответствовать нулевым подкаталогам, но и не будет соответствовать двум подкаталогам:

 $ find dir -type f #the same as yours except with a directory inside one of the subdirectories dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext $ shopt -u globstar #turn globstar off $ #will only show files in subdirectories $ #will not show files in dir or in subsubdir $ echo dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext $ shopt -s globstar #turn globstar on $ #will show all four files $ echo dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext 

Когда globstar выключен, ** заканчивается так же, как *, поэтому dir/**/*.ext получает тот же результат, что и dir/*/*.ext

 $ echo dir/*/*.ext dir/subdir1/file.ext dir/subdir2/file.ext 

который иногда обманывает меня, думая, что globstar включен

проверьте текущую настройку globstar следующим образом:

 shopt | grep globstar 
  • Как / почему это выражение работает?
  • Передача подстановочного символа * в скрипт (bash?)
  • Удалите все файлы, кроме двух
  • Исключить один шаблон из соответствия glob
  • Тестирование, если файлы начинаются с определенных букв и не содержат специального символа, за исключением периода в конце рядом с расширением файла в сценарии оболочки
  • Как скопировать файл в домашний каталог каждого пользователя в BASH?
  • Как загрузить определенные файлы с некоторого URL-адреса с помощью wget
  • Используйте расширенное подтачивание Bash, чтобы свести на нет имя файла, начинающегося с точки
  • Найти строку только в определенном файле внутри подкаталогов
  • Использование регулярного выражения в ls и mv
  • Specifiy Unix TimeStamp Range в параметре
  • Interesting Posts

    Как сделать резервную копию данных моей системы Linux, если я хочу получить ее в других операционных системах?

    не удалось установить centos на моем ноутбуке Windows 10, сделав его двойной загрузкой

    Как перемещать пространство из одной файловой системы в другую?

    Перекрестно скомпилируйте ядро ​​малины pi

    Как запомнить и легко переключаться между конфигурациями мониторов в KDE?

    Как получить папку с наибольшим числом

    Установлен ли Grub для всех MBR массива RAID по умолчанию установщиком Debian?

    Как правильно установить программное обеспечение на Linux Mint?

    Как X-сервер вычисляет DPI?

    как установить или узнать драйвер масштабирования в ядре linux

    Как установить CUDA 9.2 на Linux Mint 19

    Скомпилируйте и установите чистое ядро ​​на Debian

    Почему моя новая файловая система ext4 уже отмечена как используемая?

    bash_logout запускает только команду на последнем выходе

    Асинхронные фоновые задания в linux могут мешать друг другу?

    Linux и Unix - лучшая ОС в мире.