GNU/Linux >> Tutoriels Linux >  >> Linux

Liste des répertoires en fonction de la taille du plus grand au plus petit sur une seule ligne

Si vous êtes sûr que les noms de répertoires ne contiennent pas d'espaces, il est simple d'obtenir tous les noms de répertoires sur une seule ligne :

du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'

Obtenir les informations en python

Si vous souhaitez capturer cette sortie dans un programme python et en faire une liste. Utilisation de python2.7 ou supérieur :

import subprocess
dir_list = subprocess.check_output("du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2\" \"}'", shell=True).split()

En python2.6 :

import subprocess
subprocess.Popen("du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2\" \"}'", shell=True, stdout=subprocess.PIPE).communicate()[0].split()

Nous pouvons également tirer parti des fonctionnalités de python pour réduire la quantité de travail effectué par le shell et, en particulier, pour éliminer le besoin de awk :

subprocess.Popen("du -sk [a-z]*/ | sort -nr", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].split()[1::2]

On pourrait aller plus loin et lire le du sortie directement en python, convertir les tailles en nombres entiers et trier sur la taille. Il est cependant plus simple de le faire avec sort -nr dans le shell.

Spécifier un répertoire

Si les répertoires dont vous voulez la taille ne sont pas dans le répertoire en cours, il y a deux possibilités :

du -sk /some/path/[a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'

et aussi :

cd /some/path/ && du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'

La différence entre ces deux est de savoir si /some/path est inclus ou non dans la sortie.


Utilisation de paste

du -sk [a-z]* 2>/dev/null | sort -nr| cut -f2- | paste -s -

zsh a la capacité de trier ses globs en utilisant des qualificateurs de globbing. Vous pouvez également définir vos propres qualificateurs glob avec des fonctions. Par exemple :

zdu() REPLY=$(du -s -- "$REPLY")

print -r -- [[:alpha:]]*(/nO+zdu)

imprimerait les répertoires (/ ) dont le nom commence par une lettre (au fait, [a-z] n'a de sens que dans les paramètres régionaux C) numériquement (n) trié à l'envers (O) en utilisant le zdu fonction.

Notez que lorsque vous le faites :

du -s a b

Si a et b contiennent des liens physiques vers les mêmes fichiers, leur utilisation du disque sera comptée pour a mais pas pour b . Le zsh approche ici évite cela.

Si vous allez utiliser python, je ferais la même chose à partir de là :appelez du -s pour chacun des fichiers, et triez cette liste ici. N'oubliez pas que les noms de fichiers peuvent contenir n'importe quel caractère, y compris l'espace, la tabulation et la nouvelle ligne.


Linux
  1. Comment supprimer des fichiers et des répertoires sous Linux à partir de la ligne de commande

  2. Comment supprimer une seule ligne de l'historique ?

  3. Déplacer les fichiers vers des répertoires basés sur l'extension

  4. Bash si sur une seule ligne

  5. Répertorier les étiquettes de partition à partir de la ligne de commande

Programmer le matériel à partir de la ligne de commande Linux

Rechercher des produits Amazon à partir de la ligne de commande

Comment créer des répertoires à partir d'un fichier texte sous Linux

Copier un fichier dans plusieurs répertoires à partir de la ligne de commande sous Linux

Comment sauvegarder une seule base de données MySQL à partir de la ligne de commande

Envoyer un e-mail sous Linux à partir de la ligne de commande