Comment lister les fichiers de n plus grands répertoires?

Je suis intéressé à trouver n plus grands sous-répertoires (par exemple 3) dans mon répertoire actuel ET ALORS répertoriant tous les fichiers de leur Je ne suis pas intéressé à trouver les plus gros fichiers. Je sais qu’il y a beaucoup de solutions pour trouver les plus gros fichiers et ce n’est pas ce que je veux.

J’ai trouvé mes 3 plus grands sous-répertoires avec la ligne:

$ du -hs */ | sort -rh | head -3 

avec résultat:

 212K 04/ 52K 02/ 20K 03/ 

mais de toute façon, je ne suis pas capable de lister les fichiers de ces répertoires (la tuyauterie avec ls n’a pas fonctionné). Des suggestions comment faire cela?

Vous pouvez utiliser les résultats de vos commandes piped avec une boucle while:

 du -hs */ | sort -rh | head -3 | while read -r size dir do ls -l "$dir" done 

En une ligne:

 du -hs */ | sort -rh | head -3 | while read -r size dir ; do ls -l "$dir"; done 

Merci à steeldriver d’ avoir suggéré l’utilisation de read dans une boucle while sur une boucle for utilisant awk , pour gérer les noms de fichiers avec des espaces et des caractères spéciaux de manière plus robuste.

Substitution de commande, avec l’aide de awk pour obtenir les 3 premiers répertoires:

 ls -l $(du -hs */ | sort -rh | awk 'NR==4{exit} {print $2}') 

En supposant qu’aucun nom de répertoire ne contienne des espaces ou des caractères inhabituels.

Approche robuste: gérer tout nom de fichier (répertoire) possible, générer le nom du répertoire en tant que NUL séparé dans awk et awk aide de xargs pour gérer chaque répertoire:

 du -0hs */ | sort -zrh | awk 'BEGIN{RS="\0"} NR==4{exit} {printf("%s\0", $2)}' | \ xargs -0 ls -l 

Chaque contenu d’annuaire à la fois:

 du -0hs */ | sort -zrh | awk 'BEGIN{RS="\0"} NR==4{exit} {printf("%s\0", $2)}' | \ xargs -0 -I{} ls -l {}