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

220

Есть ли способ ограничить глубину рекурсивного списка файлов в 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
  • 2
    Не могли бы вы также что-то вроде ls -la /var/www/vhosts/* ?
Теги:

3 ответа

313
Лучший ответ

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

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

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

  • 2
    Поскольку OP хочет знать разрешения самих каталогов, вы должны добавить опцию -d к ls .
  • 0
    @ Питер ван дер Хейден: Я только что написал часть find чтобы решить его главную проблему. В любом случае спасибо, я добавляю это.
Показать ещё 4 комментария
52

Использовать опции 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 уже знает ее.

  • 7
    Это должен быть принятый ответ, намного лучше, чем мой.
  • 1
    @AlbertoZaccagni Думаю, нам нравятся короткие ответы, чтобы быстро все заработало.
32

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

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

  • 9
    Дерево это любовь. Дерево это жизнь.
  • 0
    Для некоторого случая достаточно просто tree -L 2 xxx/ или tree -L 2 -d xxx/ .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню