web-dev-qa-db-fra.com

Comment limiter la profondeur pour une liste de fichiers récursive?

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

La commande que j'utilise actuellement est la suivante:

ls -laR > dirlist.txt

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

Tout ce qui m'intéresse vraiment, ce sont les informations sur la propriété et les autorisations pour les sous-répertoires du 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

MODIFIER:

Choix final de la commande:

find -maxdepth 2 -type d -ls >dirlist
310
Jon

Extraire le drapeau -maxdepth de find

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

Ici, j'ai utilisé 1 comme profondeur de niveau maximum, -type d signifie rechercher uniquement les répertoires, qui ensuite ls -ld répertorie le contenu de, au format long.

452
Alberto Zaccagni

Utiliser les options de find

Il n'y a en fait aucun exec de /bin/ls nécessaire;

Find a une option qui ne fait que ça:

find . -maxdepth 2 -type d -ls

Pour afficher uniquement le niveau de sous-répertoires qui vous intéresse, ajoutez -mindepth au même niveau que -maxdepth:

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


Utiliser le formatage de sortie

Lorsque les détails affichés doivent être différents, -printf peut 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 -printf avec %M et %u dans format.

J'ai remarqué plus tard que vous voulez les informations de propriété complètes, qui incluent le groupe. Utilisez %g dans le format du nom symbolique, ou %G pour l'identifiant du groupe (comme aussi %U pour l'identifiant 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 montrant différentes valeurs 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

(Édité pour plus de lisibilité: en retrait, dernière ligne raccourcie)


Notes sur la performance

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

Non seulement nous sauvegardons en créant un nouveau processus pour chaque nom - une tâche énorme - mais il n’est même pas nécessaire de lire l’information, car find le sait déjà.

82
Volker Siegel

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

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

61
Sameer