Сопоставьте все файлы под всеми вложенными каталогами с оболочкой оболочки

18

Есть ли способ использовать оболочку Globbing для идентификации вложенных каталогов?

, так что если у меня есть dir / dir1 / dir2 / dir3 / dir4 / dir5 / .. и у меня есть файлы под всеми из них, каков эквивалентный шаблон globbing для соответствия всем файлам по всем каталогам, похожим на - например, ls -R     

задан Samer Buna 03.12.2010 в 20:20
источник
  • Проголосовало за переход на SuperUser.com. Также почему это помечено «git»? –  meagar♦ 03.12.2010 в 20:27
  • gitignore не использует оболочку оболочки; это отдельный вопрос. –  Cascabel 04.12.2010 в 00:16
  • Похожие: Что расширяет для всех файлов в текущем каталоге рекурсивно? на SO –  kenorb 19.04.2015 в 00:53

6 ответов

20

В Bash 4 с shopt -s globstar и zsh вы можете использовать **/* , который будет включать все, кроме скрытых файлов. Вы можете сделать shopt -s dotglob в Bash 4 или setopt dotglob в zsh, чтобы включить скрытые файлы.

В ksh используется set -o globstar . Я не думаю, что есть способ включить точечные файлы неявно, но я думаю, что **/{.[^.],}* работает.

    
ответ дан Dennis Williamson 03.12.2010 в 20:37
  • Это круто! будут ли файлы проанализированы для globing оболочки (например, например .gitignore) использовать эти настройки? –  Samer Buna 03.12.2010 в 21:14
  • @Samer Abukhait: Если оболочка делает глобус, тогда она должна. –  Dennis Williamson 03.12.2010 в 21:34
  • @Samer: Но gitignore не использует shell globbing, он использует fnmatch. –  Cascabel 04.12.2010 в 00:15
  • Я думал, что glob использует fnmatch? –  Samer Buna 04.12.2010 в 02:30
6

В частности, о git (gitignore, gitattributes и командах, которые принимают имена файлов): если шаблон не содержит косой черты, групповые символы * будут соответствовать глубине. Если он содержит слэш, git вызовет fnmatch с помощью FNM_PATHNAME , а простые подстановочные знаки не будут совпадать с косой чертой. ** для соответствия глубине не поддерживается. Возможно, такое глубокое сопоставление может быть более широко поддерживается новым флагом FNM_STARSTAR и реализацией в glibc, gnulib и других местах.

    
ответ дан Tobu 03.12.2010 в 21:27
1

Если вы хотите действовать во всех файлах, возвращаемых find, а не просто перечислить их, вы можете передать их в xargs:

find <directory> -type f | xargs ls

Но это только для команд, которые не имеют рекурсивного флага.

    
ответ дан Brent Newey 03.12.2010 в 20:41
0

Вы можете использовать дерево, оно будет рекурсивно отображать все папки.

tree <path>
    
ответ дан Fatih Arslan 03.12.2010 в 20:38
  • Но вы не можете использовать это как аргумент для команды. –  Dennis Williamson 03.12.2010 в 20:46
0

Нет никакого способа сделать это с помощью vanilla Bash, однако большинство команд принимают параметр -R или --recursive , чтобы сообщить им спуститься в каталоги.

Если вы просто хотите перечислить все файлы, расположенные в любом месте каталога или его подкаталогов, вы можете использовать найти .

Чтобы рекурсивно найти файлы ( -type f ) с заданным каталогом:

find <directory> -type f
    
ответ дан meagar 03.12.2010 в 20:26
  • @Matt Спасибо Мэтт. –  meagar♦ 03.12.2010 в 22:13
0

Вы можете попробовать:

**/*.*

Однако он будет игнорировать скрытые файлы (например, .git файлов). Иногда это спасает жизнь.

Подробнее: Что расширяет для всех файлов в текущем каталоге рекурсивно? в SO     

ответ дан kenorb 19.04.2015 в 01:34