Comment limiter la profondeur de la liste des fichiers récursifs?

346

Existe-t-il un moyen de limiter la profondeur d'une liste de fichiers récursifs sous Linux?

La commande que j'utilise en ce moment est:

ls -laR > dirlist.txt

Mais j'ai environ 200 répertoires et chacun d'eux a 10 répertoires. Cela va donc prendre beaucoup trop de temps et monopoliser trop de ressources système.

Tout ce qui m'intéresse vraiment, c'est la propriété et les informations sur les autorisations pour les sous-répertoires de premier niveau:

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

ÉDITER:

Choix final de la commande:

find -maxdepth 2 -type d -ls >dirlist
Jon
la source
3
Pourriez-vous aussi quelque chose comme ls -la /var/www/vhosts/*?
KevinO

Réponses:

494

Commander le -maxdepthdrapeau defind

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

Ici, j'ai utilisé 1 comme profondeur de niveau maximale, c'est-à- -type ddire trouver uniquement les répertoires, qui ls -ldrépertorie ensuite le contenu de, au format long.

Alberto Zaccagni
la source
2
Étant donné que l'OP souhaite connaître les autorisations des répertoires eux-mêmes, vous devez ajouter l' -doption à ls.
Peter van der Heijden
@Peter van der Heijden: Je viens d'écrire la findpartie pour résoudre son problème principal. Quoi qu'il en soit, je l'ajoute.
Alberto Zaccagni
3
J'utilise -print0et xargs -0beaucoup. Exemple:find . -maxdepth 1 -type d -print0 | xargs -0 ls -d
Chris K
2
Oh oui, certainement, cela semble faux, il n'y a pas 6 ans: D J'ai déjà commenté sur stackoverflow.com/a/25618630/57095 que ce devrait être la réponse acceptée.
Alberto Zaccagni
ahhh maxdepth, y a-t-il une option de profondeur?
Alexander Mills
95

Profitez des findoptions de

Il n'y a en fait aucun exécutable /bin/lsnécessaire;

Find a une option qui fait exactement cela:

find . -maxdepth 2 -type d -ls

Pour voir uniquement le seul niveau de sous-répertoires qui vous intéresse, ajoutez-le -mindepthau même niveau que -maxdepth:

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


Utiliser le formatage de sortie

Lorsque les détails qui s'affichent doivent être différents, -printfpeuvent afficher tous les détails d'un fichier au format personnalisé; Pour afficher les autorisations symboliques et le nom du propriétaire du fichier, utilisez -printfavec %Met %udans le format.

J'ai remarqué plus tard que vous vouliez les informations complètes sur la propriété, ce qui inclut le groupe. À utiliser %gau format du nom symbolique ou %Gde l'ID de groupe (comme aussi %Upour l'ID utilisateur numérique)

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

Cela devrait vous donner juste les détails dont vous avez besoin, pour les bons fichiers.

Je vais donner un exemple qui montre des valeurs réellement différentes pour l'utilisateur et le groupe:

$ 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

(Modifié pour plus de lisibilité: indenté, dernière ligne raccourcie)


Notes sur les performances

Bien que le temps d'exécution ne soit généralement pas pertinent pour ce type de commande, l'augmentation des performances est suffisamment importante ici pour mériter d'être signalée:

Non seulement nous économisons la création d'un nouveau processus pour chaque nom - une tâche énorme - les informations n'ont même pas besoin d'être lues, comme nous le savons finddéjà.

Volker Siegel
la source
9
Cela devrait être la réponse acceptée, bien meilleure que la mienne.
Alberto Zaccagni
1
@AlbertoZaccagni Je suppose que nous aimons les réponses courtes pour que les choses fonctionnent rapidement.
anddero
65

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

Imprime l'arborescence de répertoires dans un joli format jusqu'à la profondeur 2 (-L 2). Affiche l'utilisateur (-u) et le groupe (-g) et les autorisations (-p). Imprime uniquement les répertoires (-d). l'arbre a beaucoup d'autres options utiles.

Sameer
la source
12
l'arbre est l'amour. l'arbre est la vie.
yosefrow
Simplement tree -L 2 xxx/ou tree -L 2 -d xxx/suffit dans certains cas.
Eric Wang
1

Tout ce qui m'intéresse vraiment, c'est la propriété et les informations sur les autorisations pour les sous-répertoires de premier niveau.

J'ai trouvé une solution facile tout en jouant mon poisson, qui correspond parfaitement à votre besoin.

ll `ls`

ou

ls -l $(ls)
récolter
la source