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


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уже знает.


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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.