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

Я пытаюсь найти все файлы PDF в какой-либо папке и любой подпапке только в терминале, а не в сценарии. Я также новичок в 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?


person Nick Loughlin    schedule 08.02.2012    source источник


Ответы (2)


Вы можете подумать о том, чтобы найти

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

or

find . -name '*.pdf' -ls

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

person jim mcnamara    schedule 23.02.2012
comment
Под глобальными расширениями вы подразумеваете опцию оболочки extglob? Это чтит find? - person MestreLion; 09.11.2019

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

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

shopt -s globstar

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

shopt -s extglob

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

shopt -u globstar
person Nick Loughlin    schedule 08.02.2012