Я хотел бы написать что-то вроде этого:
$ ls **.py
чтобы получить все .py имена файлов, рекурсивно обходить иерархию каталогов.
Даже если есть файлы .py, которые нужно найти, оболочка (bash) выдает следующее:
ls: cannot access **.py: No such file or directory
Любой способ сделать то, что я хочу?
РЕДАКТИРОВАТЬ: Я хотел бы указать, что я не заинтересован в конкретном случае ls
, но вопрос о синтаксисе glob.
nullglob
nullglob
я настоятельно рекомендую прочитать следующие предупреждения .wc -l {**,.}/*.py
работает просто отлично** не делает ничего, кроме одного *, оба работают в текущем каталоге
источник
find
если у вас нет bash 4. Примеры:yourcommand `find . -name '*.py'`
(обратите внимание на обратные ссылки);find . -name '*.py' -exec yourcommand {} \;
,Начиная с Bash 4 (также включая zsh) была добавлена новая опция globbing (
globstar
), которая обрабатывает шаблон по-**
разному, когда он установлен.Он сопоставляется с шаблоном подстановки и возвращает имена файлов и каталогов, которые затем соответствуют, заменяя шаблон подстановки в команде соответствующими элементами.
Обычно при использовании
**
он работает аналогично*
, но рекурсивно рекурсивно обращается ко всем каталогам (например, цикл).Чтобы увидеть, включен ли он, проверьте его с помощью
shopt globstar
(в сценариях используйтеshopt -q globstar
).Этот пример
**.py
будет работать только для текущего каталога, так как он не возвращает список каталогов, которые могут быть рекурсивными, поэтому вам нужно использовать несколько подстановочных знаков уровня каталога**/*.py
, чтобы он мог идти глубже.Пожалуйста, найдите на SO несколько синтаксических тестов, которые я сделал для рекурсивного поиска всех файлов.
источник