Jak ograniczyć głębokość listy plików rekurencyjnych?

346

Czy istnieje sposób na ograniczenie głębokości listy plików rekurencyjnych w systemie Linux?

Obecnie używam polecenia:

ls -laR > dirlist.txt

Ale mam około 200 katalogów i każdy z nich ma 10 katalogów. Zajmie to zbyt długo i pochłonie zbyt wiele zasobów systemowych.

Wszystko, co naprawdę mnie interesuje, to informacje o własności i uprawnieniach dla podkatalogów pierwszego poziomu:

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

EDYTOWAĆ:

Ostateczny wybór polecenia:

find -maxdepth 2 -type d -ls >dirlist
Jon
źródło
3
Mógłbyś też coś takiego ls -la /var/www/vhosts/*?
KevinO

Odpowiedzi:

494

Kasa -maxdepthflagafind

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

Tutaj użyłem 1 jako maksymalnej głębokości poziomu, -type dczyli znajdź tylko katalogi, które następnie ls -ldwyświetlają zawartość w długim formacie.

Alberto Zaccagni
źródło
2
Ponieważ OP chce znać uprawnienia samych katalogów, należy dodać -dopcję do ls.
Peter van der Heijden,
@Peter van der Heijden: Właśnie napisałem findczęść, aby rozwiązać jego główny problem. W każdym razie dzięki, dodaję to.
Alberto Zaccagni
3
Używam -print0i xargs -0dużo. Przykład:find . -maxdepth 1 -type d -print0 | xargs -0 ls -d
Chris K
2
O tak, na pewno wygląda to źle, wiem, ale 6 lat temu tak nie było: D Skomentowałem już na stackoverflow.com/a/25618630/57095, że to powinna być zaakceptowana odpowiedź.
Alberto Zaccagni 21.04.16
ahhh maxdepth, czy jest opcja głębokości?
Alexander Mills,
95

Skorzystaj z findopcji

W rzeczywistości nie ma /bin/lspotrzeby wykonywania;

Znajdź ma opcję, która właśnie to:

find . -maxdepth 2 -type d -ls

Aby zobaczyć tylko jeden poziom podkatalogów, którymi jesteś zainteresowany, dodaj -mindepthdo tego samego poziomu, co -maxdepth:

find . -mindepth 2 -maxdepth 2 -type d -ls


Użyj formatowania wyjściowego

Gdy wyświetlane szczegóły powinny być inne, -printfmogą pokazywać wszelkie szczegóły dotyczące pliku w niestandardowym formacie; Aby wyświetlić symboliczne uprawnienia i nazwę właściciela pliku, użyj -printfz %Moraz %uw format.

Zauważyłem później, że chcesz uzyskać pełne informacje o własności, w tym grupę. Użyj %gw formacie nazwy symbolicznej lub %Gidentyfikatora grupy (podobnie jak %Unumerycznego identyfikatora użytkownika)

find . -mindepth 2 -maxdepth 2 -type d -printf '%M %u %g %p\n'

Powinno to dostarczyć ci tylko potrzebnych informacji i odpowiednich plików.

Dam przykład, który pokazuje różne wartości dla użytkownika i grupy:

$ 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

(Edytowano pod kątem czytelności: wcięty, skrócony ostatni wiersz)


Uwagi na temat wydajności

Chociaż czas wykonywania jest w większości przypadków nieistotny dla tego rodzaju poleceń, wzrost wydajności jest na tyle duży, że warto go wskazać:

Nie tylko oszczędzamy tworzenie nowego procesu dla każdej nazwy - ogromne zadanie - informacja nie musi nawet być czytana, ponieważ findjuż ją zna.

Volker Siegel
źródło
9
To powinna być zaakceptowana odpowiedź, znacznie lepsza niż moja.
Alberto Zaccagni
1
@AlbertoZaccagni Chyba lubimy krótkie odpowiedzi, aby szybko zacząć działać.
anddero
65

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

Drukuje drzewo katalogów w ładnym formacie do głębokości 2 (-L 2). Wydrukuj użytkownika (-u) i grupę (-g) i uprawnienia (-p). Drukuj tylko katalogi (-d). drzewo ma wiele innych przydatnych opcji.

Sameer
źródło
12
drzewo jest miłością. drzewo jest życiem.
yosefrow
Po prostu tree -L 2 xxx/lub tree -L 2 -d xxx/w niektórych przypadkach wystarczy.
Eric Wang
1

Wszystko, co naprawdę mnie interesuje, to informacje dotyczące własności i uprawnień do podkatalogów pierwszego poziomu.

Podczas gry z moją rybą znalazłem łatwe rozwiązanie, które idealnie pasuje do twoich potrzeb.

ll `ls`

lub

ls -l $(ls)
recolic
źródło