Перелистывание с ls, чтобы найти все файлы, соответствующие определенному шаблону - PullRequest
11 голосов
/ 08 февраля 2012

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

Я использую bash 4.1.5 (1) -релиз (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?

Ответы [ 2 ]

14 голосов
/ 23 февраля 2012

Вы можете рассмотреть поиск

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

или

find . -name '*.pdf' -ls

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

5 голосов
/ 08 февраля 2012

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

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

shopt -s globstar

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

shopt -s extglob

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

shopt -u globstar
...