Wie kann die Tiefe für die rekursive Dateiliste begrenzt werden?

346

Gibt es eine Möglichkeit, die Tiefe einer rekursiven Dateiliste unter Linux zu begrenzen?

Der Befehl, den ich gerade benutze, lautet:

ls -laR > dirlist.txt

Aber ich habe ungefähr 200 Verzeichnisse und jedes von ihnen hat 10 Verzeichnisse. Es wird also viel zu lange dauern und zu viele Systemressourcen beanspruchen.

Alles, was mich wirklich interessiert, sind die Besitz- und Berechtigungsinformationen für die Unterverzeichnisse der ersten Ebene:

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

BEARBEITEN:

Endgültige Befehlswahl:

find -maxdepth 2 -type d -ls >dirlist
Jon
quelle
3
Könnten Sie auch so etwas ls -la /var/www/vhosts/*?
KevinO

Antworten:

494

Kasse die -maxdepthFlagge vonfind

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

Hier habe ich 1 als maximale Level-Tiefe verwendet, -type ddh nur Verzeichnisse finden, die dann den ls -ldInhalt von im Langformat auflisten.

Alberto Zaccagni
quelle
2
Da das OP die Berechtigungen der Verzeichnisse selbst kennen möchte, sollten Sie die -dOption hinzufügen ls.
Peter van der Heijden
@ Peter van der Heijden: Ich habe gerade den findTeil geschrieben, um sein Hauptproblem zu lösen. Trotzdem danke, ich füge es hinzu.
Alberto Zaccagni
3
Ich benutze -print0und xargs -0viel. Beispiel:find . -maxdepth 1 -type d -print0 | xargs -0 ls -d
Chris K
2
Oh ja, auf jeden Fall sieht es falsch aus, aber vor 6 Jahren noch nicht: D Ich habe bereits auf stackoverflow.com/a/25618630/57095 kommentiert, dass es die akzeptierte Antwort sein sollte.
Alberto Zaccagni
ahhh maxdepth, gibt es eine tiefenoption?
Alexander Mills
95

Nutzen Sie finddie Optionen von

Es wird tatsächlich kein Exec /bin/lsbenötigt;

Suchen hat eine Option, die genau das tut:

find . -maxdepth 2 -type d -ls

Um nur die eine Ebene von Unterverzeichnissen anzuzeigen, an der Sie interessiert sind, fügen Sie -mindepthdieselbe Ebene hinzu wie -maxdepth:

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


Verwenden Sie die Ausgabeformatierung

Wenn die angezeigten Details unterschiedlich sein sollten, -printfkönnen alle Details zu einer Datei im benutzerdefinierten Format angezeigt werden . Verwenden Sie -printfmit %Mund %uin der Datei, um die symbolischen Berechtigungen und den Eigentümernamen der Datei anzuzeigen format.

Ich habe später bemerkt, dass Sie die vollständigen Eigentumsinformationen wünschen, einschließlich der Gruppe. Verwendung %gim Format für den symbolischen Namen oder %Gfür die Gruppen-ID (wie auch %Ufür die numerische Benutzer-ID)

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

Dies sollte Ihnen genau die Details geben, die Sie benötigen, für genau die richtigen Dateien.

Ich werde ein Beispiel geben, das tatsächlich unterschiedliche Werte für Benutzer und Gruppe zeigt:

$ 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

(Zur besseren Lesbarkeit bearbeitet: eingerückte, verkürzte letzte Zeile)


Hinweise zur Leistung

Obwohl die Ausführungszeit für diese Art von Befehl größtenteils irrelevant ist, ist die Leistungssteigerung hier groß genug, um darauf hinzuweisen:

Wir sparen nicht nur das Erstellen eines neuen Prozesses für jeden Namen - eine große Aufgabe - die Informationen müssen nicht einmal gelesen werden, wie es findbereits bekannt ist.

Volker Siegel
quelle
9
Dies sollte die akzeptierte Antwort sein, viel besser als meine.
Alberto Zaccagni
1
@AlbertoZaccagni Ich denke, wir mögen kurze Antworten, um die Dinge schnell zum Laufen zu bringen.
Anddero
65

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

Druckt den Verzeichnisbaum in einem hübschen Format bis zur Tiefe 2 (-L 2). Benutzer (-u) und Gruppe (-g) und Berechtigungen (-p) drucken. Nur Verzeichnisse drucken (-d). Baum hat viele andere nützliche Optionen.

Sameer
quelle
12
Baum ist Liebe. Baum ist Leben.
Josefrow
Einfach tree -L 2 xxx/oder tree -L 2 -d xxx/reicht für einen Fall.
Eric Wang
1

Alles, was mich wirklich interessiert, sind die Besitz- und Berechtigungsinformationen für die Unterverzeichnisse der ersten Ebene.

Ich habe beim Spielen meines Fisches eine einfache Lösung gefunden, die perfekt zu Ihren Bedürfnissen passt.

ll `ls`

oder

ls -l $(ls)
recolic
quelle