Globbing с ls, чтобы найти все файлы, соответствующие определенному шаблону

Я пытаюсь найти все файлы PDF в некоторой папке и любой вложенной папке только в терминале, а не в script. Я также совершенно новичок в Linux, поэтому извиняюсь, если я пропустил что-то очевидное или, возможно, жизненно важно для диагностики моей конкретной проблемы.

Я использую bash 4.1.5 (1) -release (i486-pc-linux-gnu), и проделал некоторые действия в google о glob и extglob-выражениях, и он выглядит синтаксисом, который должен быть используя

$ ls **.pdf

Это ничего не находит, так как нет файла, соответствующего шаблону *.pdf в текущей папке ./; он, похоже, хочет читать ** как *:

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

Есть PDF файлы в другом месте, в подпапках от 1 до 5 глубины (в частности, в каждой подпапке 1-глубокой), некоторые из которых я вижу, проверяя с помощью

$ ls */*.pdf

Следовательно, ls работает правильно. Его руководство, похоже, не очень полезно, так как все, что я мог видеть, может быть полезным для нас: ls с флагом -R, который не решает проблему в любом из перечисленных случаев.

Я попытался использовать шаблоны extglob (обязательно включив их с помощью shopt). Я могу видеть мои файлы глубины-1 с помощью ls */*?(.)pdf, но я ничего не вижу с помощью ls .*(/*)pdf или ls .*(/*).pdf, даже изнутри подкаталога, где есть PDF файлы.

Я читал в другом месте (в отношении файла .gitignore в репозитории git), что шаблон ** не работает для всех.

Может ли это повлиять на меня и как я могу его исправить (в идеале без привилегий суперпользователя)? Может ли это (или связанная с этим проблема) также влиять на функциональность extglob?

Ответ 1

Вы можете захотеть найти

find . -name '*.pdf' -exec ls -l {} \;

или

find . -name '*.pdf' -ls

где. это ваш текущий рабочий каталог. Функциональность glob поставляется с 4.0+ bash. Расширения glob не переносимы другими словами.

Ответ 2

Параметры extglob и globstar необходимы для получения расширенной функциональности из библиотеки glob; они включаются с помощью утилиты оболочки (shopt), как описано ниже.

Чтобы использовать globstar (который вызывает поведение шаблона **, как описано в руководстве bash), его необходимо активировать (в bash 4.0+) с помощью

shopt -s globstar

и для включения более "функциональных" выражений типа регулярного выражения, таких как ?(ab) и *(ab) их полный эффект, используйте

shopt -s extglob

Чтобы снова отключить параметры, укажите -u вместо s, для eaxample

shopt -u globstar