Как ограничить глубину для рекурсивного списка файлов?

346

Есть ли способ ограничить глубину рекурсивного списка файлов в Linux?

Команда, которую я использую в данный момент:

ls -laR > dirlist.txt

Но у меня есть около 200 каталогов, и у каждого из них по 10 каталогов. Так что это займет слишком много времени и потребует слишком много системных ресурсов.

Все, что меня действительно интересует, это информация о владельцах и разрешениях для подкаталогов первого уровня:

drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk  
drwxr--r-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/htdocs  
drwxr--r-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk  
drwxr-xrwx 14 proftp root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk/htdocs  
drwxr-xrwx 14 proftp root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk/htdocs  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk/htdocs
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk/cgi-bin

РЕДАКТИРОВАТЬ:

Окончательный выбор команды:

find -maxdepth 2 -type d -ls >dirlist
Джон
источник
3
Не могли бы вы также что-то вроде ls -la /var/www/vhosts/*?
KevinO

Ответы:

494

Оформить -maxdepthфлагfind

find . -maxdepth 1 -type d -exec ls -ld "{}" \;

Здесь я использовал 1 как максимальную глубину уровня, то -type dесть найти только каталоги, которые затем ls -ldперечисляют содержимое в длинном формате.

Альберто Закканьи
источник
2
Поскольку OP хочет знать разрешения самих каталогов, вы должны добавить -dопцию в ls.
Питер ван дер Хейден
@ Питер ван дер Хейден: Я только что написал findчасть, чтобы решить его главную проблему. В любом случае спасибо, я добавляю это.
Альберто Закканьи
3
Я пользуюсь -print0и xargs -0много. Пример:find . -maxdepth 1 -type d -print0 | xargs -0 ls -d
Крис К
2
Ах, да, определенно это выглядит неправильно, но не 6 лет назад: D Я уже прокомментировал stackoverflow.com/a/25618630/57095, что это должен быть принятый ответ.
Альберто Закканьи
ааааа maxdepth, есть ли вариант глубины?
Александр Миллс
95

Используйте findопции 's'

На самом деле нет никакого /bin/lsнеобходимого;

Find имеет опцию, которая делает именно это:

find . -maxdepth 2 -type d -ls

Чтобы увидеть только один уровень подкаталогов, которые вас интересуют, добавьте -mindepthк тому же уровню, что и -maxdepth:

find . -mindepth 2 -maxdepth 2 -type d -ls

Использовать форматирование вывода

Когда детали, которые отображаются, должны отличаться, -printfмогут отображаться любые подробности о файле в произвольном формате; Чтобы показать символические разрешения и имя владельца файла, используйте -printfс %Mи %uв format.

Позже я заметил, что вы хотите полную информацию о владельце, которая включает в себя группу. Используйте %gв формате для символического имени или %Gдля идентификатора группы (как также %Uдля числового идентификатора пользователя)

find . -mindepth 2 -maxdepth 2 -type d -printf '%M %u %g %p\n'

Это должно дать вам только те детали, которые вам нужны, только для правильных файлов.

Я приведу пример, который показывает фактически разные значения для пользователя и группы:

$ sudo find /tmp -mindepth 2 -maxdepth 2 -type d -printf '%M %u %g %p\n'
drwx------ www-data  www-data /tmp/user/33
drwx------ octopussy root     /tmp/user/126
drwx------ root      root     /tmp/user/0
drwx------ siegel    root     /tmp/user/1000
drwxrwxrwt root      root     /tmp/systemd-[...].service-HRUQmm/tmp

(Отредактировано для удобства чтения: отступ, сокращение последней строки)


Примечания по производительности

Хотя время выполнения для команды такого рода в основном не имеет значения, прирост производительности здесь достаточно велик, чтобы на него стоило указать:

Мало того, что мы сохраняем создание нового процесса для каждого имени - огромная задача - информацию даже не нужно читать, как она findуже знает.

Volker Siegel
источник
9
Это должен быть принятый ответ, намного лучше, чем мой.
Альберто Закканьи
1
@AlbertoZaccagni Думаю, нам нравятся короткие ответы, чтобы быстро все заработало.
Андеро
65

tree -L 2 -u -g -p -d

Печатает дерево каталогов в хорошем формате до глубины 2 (-L 2). Печать пользователя (-u) и группы (-g) и прав доступа (-p). Печатать только каталоги (-d). У дерева есть много других полезных опций.

Самир
источник
12
дерево это любовь Дерево это жизнь.
yosefrow
Просто tree -L 2 xxx/или tree -L 2 -d xxx/достаточно для какого-то случая.
Эрик Ван
1

Все, что меня действительно интересует, это информация о владельцах и разрешениях для подкаталогов первого уровня.

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

ll `ls`

или

ls -l $(ls)
recolic
источник