Как ограничить глубину для рекурсивного списка файлов? - PullRequest
303 голосов
/ 22 декабря 2010

Есть ли способ ограничить глубину рекурсивного листинга в 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

EDIT:

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

find -maxdepth 2 -type d -ls >dirlist

Ответы [ 3 ]

441 голосов
/ 22 декабря 2010

Проверьте флаг -maxdepth find

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

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

80 голосов
/ 02 сентября 2014

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

На самом деле нет необходимости в /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 уже знаетэто.

61 голосов
/ 04 июня 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...