Як обмежити глибину для рекурсивного списку файлів?


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
Оскільки ОП хоче знати самі дозволи довідників, вам слід додати цю -dопцію ls.
Пітер ван дер Хайден

@ Peter van der Heijden: Я щойно написав 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 Я думаю, нам подобаються короткі відповіді, щоб швидко налагодити роботу.
anddero

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.