387 votes

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

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

La commande que j'utilise en ce moment est :

ls -laR > dirlist.txt

Mais j'ai environ 200 annuaires et chacun d'eux a des dizaines d'annuaires. Cela va donc prendre beaucoup trop de temps et monopoliser trop de ressources système.

Tout ce qui m'intéresse vraiment, ce sont les informations relatives à la propriété et aux 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

EDIT :

Choix final du commandement :

find -maxdepth 2 -type d -ls >dirlist

3 votes

Pourriez-vous aussi faire quelque chose comme ls -la /var/www/vhosts/* ?

556voto

Alberto Zaccagni Points 11478

Consultez le -maxdepth drapeau de find

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

Ici, j'ai utilisé 1 comme profondeur maximale du niveau, -type d signifie ne trouver que les répertoires, qui alors ls -ld liste le contenu de, en format long.

3 votes

Puisque le PO veut connaître les permissions des répertoires eux-mêmes, vous devriez ajouter l'option -d option pour ls .

0 votes

@Peter van der Heijden : Je viens d'écrire le find pour résoudre son principal problème. En tout cas, merci, je l'ajoute.

3 votes

J'utilise -print0 et xargs -0 beaucoup. Exemple : find . -maxdepth 1 -type d -print0 | xargs -0 ls -d

106voto

Volker Siegel Points 352

Utilisez find Options de l'UE

Il n'y a en fait aucune exécution de /bin/ls nécessaire ;

Find dispose d'une option qui fait exactement cela :

find . -maxdepth 2 -type d -ls

Pour voir uniquement le premier 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 qui s'affichent doivent être différents, -printf peut afficher n'importe quel détail sur un fichier dans un format personnalisé ; Pour afficher les permissions symboliques et le nom du propriétaire du fichier, utilisez -printf avec %M et %u dans le format .

J'ai remarqué plus tard que vous vouliez les informations complètes sur la propriété, ce qui inclut le groupe. Utilisez %g au format du nom symbolique, ou %G pour l'identifiant du groupe (comme aussi %U pour l'identification numérique de l'utilisateur)

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

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

Je vais donner un exemple qui montre des valeurs réellement différentes pour user et group :

$ 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é : mise en retrait, dernière ligne raccourcie)

Notes sur les performances

Bien que le temps d'exécution n'ait pas d'importance pour ce type de commande, l'augmentation des performances est suffisamment importante pour qu'il faille la souligner. est suffisamment importante ici pour que cela vaille la peine de le signaler :

Non seulement nous évitons de créer un nouveau processus pour chaque nom - un énorme tâche - l'information ne doit même pas être lue, car find le sait déjà.

11 votes

Cela devrait être la réponse acceptée, bien meilleure que la mienne.

1 votes

@AlbertoZaccagni Je suppose que nous aimons les réponses courtes pour que les choses fonctionnent rapidement.

68voto

Sameer Points 120

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

Imprime l'arbre des répertoires dans un joli format jusqu'à la profondeur 2 (-L 2). Affiche l'utilisateur (-u), le groupe (-g) et les permissions (-p). Imprimer seulement les répertoires (-d). tree a beaucoup d'autres options utiles.

13 votes

L'arbre est amour. l'arbre est vie.

0 votes

Tout simplement tree -L 2 xxx/ ou tree -L 2 -d xxx/ est suffisant dans certains cas.

2voto

recolic Points 117

Tout ce qui m'intéresse vraiment, ce sont les informations relatives à la propriété et aux autorisations pour les sous-répertoires de premier niveau.

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

ll `ls`

ou

ls -l $(ls)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X