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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

find <directory> -type f | xargs ls

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

Ответ 4

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

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

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

find <directory> -type f

Ответ 5

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

tree <path>