Как ограничить глубину для рекурсивного списка файлов?
Есть ли способ ограничить глубину рекурсивного списка файлов в 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
Ответы
Ответ 1
Оформить флажок -maxdepth
find
find . -maxdepth 1 -type d -exec ls -ld "{}" \;
Здесь я использовал 1 как максимальную глубину уровня, -type d
означает найти только каталоги, которые затем ls -ld
перечисляют содержимое в длинном формате.
Ответ 2
Использовать опции find
Фактически нет exec /bin/ls
;
Найти имеет параметр, который делает именно это:
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
уже знает ее.
Ответ 3
tree -L 2 -u -g -p -d
Печатает дерево каталогов в симпатичном формате до глубины 2 (-L 2).
Распечатайте пользователя (-u) и группу (-g) и разрешения (-p).
Печатать только каталоги (-d).
В дереве есть много других полезных опций.