web-dev-qa-db-fra.com

Utiliser ls pour lister les répertoires et leurs tailles totales

Est-il possible d'utiliser ls sous Unix pour lister la taille totale d'un sous-répertoire et tout son contenu contrairement au 4K habituel qui (je suppose) n'est que le fichier répertoire lui-même? C'EST À DIRE.

total 12K
drwxrwxr-x  6 *** *** 4.0K 2009-06-19 10:10 branches
drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags
drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk

Après avoir parcouru les pages de manuel, j'arrive vide.

684
kmorris511

Essayez quelque chose comme:

du -sh *

version courte de:

du --summary --human-readable *

Explication:

du:DiskUsage

-s: Affiche un résumé pour chaque fichier spécifié. (Équivalent à -d 0)

-h: sortie "lisible par l'homme". Utilisez les suffixes d'unité:Byte,Kibibyte (KiB),Mebibyte (MiB),Gibibyte (GiB),Tebibyte (TiB) etPebibyte (PiB). (BASE2)

1297
molf

du -sk * | sort -n va trier les dossiers par taille. Utile lorsqu'on cherche à libérer de l'espace ..

273
GraveDigger
du -sh * | sort -h

Cela sera affiché dans un format lisible par l'homme.

87
user2969885

Pour répertorier les répertoires les plus volumineux du répertoire en cours dans un format lisible par l'homme: 

du -sh * | sort -hr

Un meilleur moyen de limiter le nombre de lignes peut être 

du -sh * | sort -hr | head -n10

Où vous pouvez augmenter le suffixe de -n pour limiter le nombre de lignes répertoriées 

Échantillon: 

[~]$ du -sh * | sort -hr
48M app
11M lib
6.7M    Vendor
1.1M    composer.phar
488K    phpcs.phar
488K    phpcbf.phar
72K doc
16K nbproject
8.0K    composer.lock
4.0K    README.md

Cela le rend plus pratique à lire :)

37
Jay Chakra

Pour l'afficher au format ls -lh, utilisez:

(du -sh ./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }'

Code Awk expliqué:

if($1 == "total") { // Set X when start of ls is detected
  X = 1 
} else if (!X) { // Until X is set, collect the sizes from `du`
  SIZES[$2] = $1
} else {
  // Replace the size on current current line (with alignment)
  sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); 
  print $0
}

Exemple de sortie:

drwxr-xr-x 2 root     root 4.0K    Feb 12 16:43 cgi-bin
drwxrws--- 6 root     www  20M     Feb 18 11:07 document_root
drwxr-xr-x 3 root     root 1.3M    Feb 18 00:18 icons
drwxrwsr-x 2 localusr www  8.0K    Dec 27 01:23 passwd
23
Sebi

La commande que vous voulez utiliser est 'du -sk' du = "utilisation du disque"

L'indicateur -k vous donne une sortie en kilo-octets, plutôt que le nombre par défaut de secteurs de disque (blocs de 512 octets). 

L’indicateur -s ne listera que les éléments du répertoire de niveau supérieur (c’est-à-dire le répertoire en cours, par défaut, ou le répertoire spécifié sur la ligne de commande). Il est étrange que du ait le comportement opposé de ls à cet égard. Par défaut, du vous donnera récursivement l'utilisation du disque de chaque sous-répertoire. En revanche, ls ne donnera que des fichiers de liste dans le répertoire spécifié. (ls -R vous donne un comportement récursif.)

20
Keith Smith

Mettez cette déclaration de fonction Shell dans vos scripts d'initialisation Shell:

function duls {
    paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}

Je l'ai appelée duls car elle affiche les résultats de du et ls (dans cet ordre):

$ duls
210M    drwxr-xr-x  21 kk  staff  714 Jun 15 09:32 .

$ duls *
 36K    -rw-r--r--   1 kk  staff    35147 Jun  9 16:03 COPYING
8.0K    -rw-r--r--   1 kk  staff     6962 Jun  9 16:03 INSTALL
 28K    -rw-r--r--   1 kk  staff    24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--   1 kk  staff       75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--   1 kk  staff    24473 Jun 10 13:26 Makefile.in
4.0K    -rw-r--r--   1 kk  staff     1689 Jun  9 16:03 README
120K    -rw-r--r--   1 kk  staff   121585 Jun 10 13:26 aclocal.m4
684K    drwxr-xr-x   7 kk  staff      238 Jun 10 13:26 autom4te.cache
128K    drwxr-xr-x   8 kk  staff      272 Jun  9 16:03 build
 60K    -rw-r--r--   1 kk  staff    60083 Jun 10 13:26 config.log
 36K    -rwxr-xr-x   1 kk  staff    34716 Jun 10 13:26 config.status
264K    -rwxr-xr-x   1 kk  staff   266637 Jun 10 13:26 configure
8.0K    -rw-r--r--   1 kk  staff     4280 Jun 10 13:25 configure.ac
7.0M    drwxr-xr-x   8 kk  staff      272 Jun 10 13:26 doc
2.3M    drwxr-xr-x  28 kk  staff      952 Jun 10 13:26 examples
6.2M    -rw-r--r--   1 kk  staff  6505797 Jun 15 09:32 mrbayes-3.2.7-dev.tar.gz
 11M    drwxr-xr-x  42 kk  staff     1428 Jun 10 13:26 src

$ duls doc
7.0M    drwxr-xr-x  8 kk  staff  272 Jun 10 13:26 doc

$ duls [bM]*
 28K    -rw-r--r--  1 kk  staff  24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--  1 kk  staff     75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--  1 kk  staff  24473 Jun 10 13:26 Makefile.in
128K    drwxr-xr-x  8 kk  staff    272 Jun  9 16:03 build

Explication:

L'utilitaire paste crée des colonnes à partir de son entrée en fonction de la spécification que vous lui donnez. Étant donné deux fichiers d'entrée, il les met côte à côte, avec une tabulation comme séparateur.

Nous lui donnons la sortie de du -hs -- "$@" | cut -f1 comme premier fichier (flux d'entrée réellement) et la sortie de ls -ld -- "$@" comme deuxième fichier.

Dans la fonction, "$@" sera évalué à la liste de tous les arguments de la ligne de commande, chacun entre guillemets. Il comprendra donc les caractères globaux et les noms de chemins avec des espaces, etc.

Le double double (--) signale la fin des options de ligne de commande à du et ls. Sans cela, dire duls -l confondrait du et toute option pour du que ls n'aurait pas confondrait ls (et les options qui existent dans les deux utilitaires pourraient ne pas signifier la même chose et ce serait un joli désordre).

cut après du supprime simplement la première colonne de la sortie du -hs (les tailles).

J'ai décidé de mettre la sortie du à gauche, sinon j'aurais dû gérer une colonne de droite vacillante (en raison de la longueur variable des noms de fichiers).

La commande n'acceptera pas les indicateurs de ligne de commande. 

Ceci a été testé à la fois dans bash et dans ksh93. Cela ne fonctionnera pas avec /bin/sh.

10
Kusalananda
du -h --max-depth=1 . | sort -n -r
7
StarDust

J'utilise toujours du -sk (drapeau -k indiquant la taille du fichier en kilo-octets) à la place. 

7
Crenshaw

C'est celui que j'aime

update : Je n'ai pas aimé le précédent car il ne montrait pas les fichiers dans le répertoire actuel, il ne listait que les répertoires.

Exemple de sortie pour /var sur ubuntu:

Sudo du -hDaxd1 /var | sort -h | tail -n10

4.0K    /var/lock
4.0K    /var/run
4.0K    /var/www
12K     /var/spool
3.7M    /var/backups
33M     /var/log
45M     /var/webmin
231M    /var/cache
1.4G    /var/lib
1.7G    /var
4
meffect

du -sch * dans le même répertoire.

4
John
du -S

du possède une autre option utile: -S, --separate-dirs indiquant du ne pas inclure la taille des sous-répertoires - pratique dans certaines occasions.

Exemple 1 - montre seulement les tailles de fichier dans un répertoire:

du -Sh  * 
3,1G    10/CR2
280M    10

Exemple 2 - affiche les tailles de fichier et les sous-répertoires dans le répertoire:

du -h  * 
3,1G    10/CR2 
3,4G    10
3
sopel

Ce sont toutes d'excellentes suggestions, mais celle que j'utilise est la suivante:

du -ksh * | sort -n -r

-ksh s'assure que les fichiers et les dossiers sont listés dans un format lisible par l'homme, en mégaoctets, en kilo-octets, etc. 

Le seul inconvénient de cette commande est que l'ordinateur ne sait pas que le gigaoctet est plus gros que le mégaoctet. Il ne fait donc que trier par numéros et vous trouverez souvent des listes comme celle-ci:

120K
12M
4G

Faites juste attention à regarder l'unité. 

Cette commande fonctionne également sur le Mac (alors que sort -h ne le fait pas par exemple).

3
kakubei

regardez la commande du pour cela

3
zappan

du -sm * | trier -nr 

Sortie par taille 

3
Amir

juste un avertissement, si vous voulez comparer la taille des fichiers. du produit des résultats différents selon le système de fichiers, la taille du bloc, ....

Il peut arriver que la taille des fichiers soit différente, par exemple. en comparant le même répertoire sur votre disque dur local et un périphérique de stockage de masse USB. J'utilise le script suivant, y compris ls pour résumer la taille du répertoire. Le résultat est exprimé en octets en prenant en compte tous les sous-répertoires.

echo "[GetFileSize.sh] target directory: \"$1\""

iRetValue=0

uiLength=$(expr length "$1")
if [ $uiLength -lt 2 ]; then
  echo "[GetFileSize.sh] invalid target directory: \"$1\" - exiting!"
  iRetValue=-1
else
  echo "[GetFileSize.sh] computing size of files..."

  # use ls to compute total size of all files - skip directories as they may
  # show different sizes, depending on block size of target disk / file system
  uiTotalSize=$(ls -l -R $1 | grep -v ^d | awk '{total+=$5;} END {print total;}')
  uiLength=$(expr length "$uiTotalSize")
  if [ $uiLength -lt 1 ]; then
    uiTotalSize=0
  fi
  echo -e "[GetFileSize.sh] total target file size: \"$uiTotalSize\""

fi

exit "$iRetValue"
2
Martin Wilde

ncdu NCURSES du

Cet utilitaire de CLI génial vous permet de trouver facilement les gros fichiers et répertoires de manière interactive.

Par exemple, depuis l'intérieur de l'arbre d'un projet bien connu , nous faisons:

Sudo apt-get install ncdu
ncdu

Le résultat est:

enter image description here

Ensuite, j'entre en bas à droite de mon clavier pour aller dans le dossier /drivers et je vois:

enter image description here

ncdu calcule uniquement la taille des fichiers de manière récursive une fois au démarrage pour l’ensemble de l’arborescence, elle est donc efficace.

"Utilisation totale du disque" vs "Taille apparente" est analogue à du, et je l'ai expliqué à: pourquoi la sortie de `du` est-elle si différente de celle de` du -b`

Page d'accueil du projet: https://dev.yorhel.nl/ncdu _

Questions connexes:

Testé sous Ubuntu 16.04.

Pour afficher de manière récursive la taille des fichiers et des sous-répertoires du répertoire en cours:

du -h .

Pour afficher les informations de taille identique _ mais sans imprimer récursivement leurs sous-répertoires (ce qui peut être une liste énorme), utilisez simplement l'option --max-depth:

du -h --max-depth=1 .
1
Pascal

Pendant un certain temps, j'ai utilisé Nautilus (sur le bureau Gnome sous RHEL 6.0) pour supprimer des fichiers de mon dossier personnel au lieu d'utiliser la commande rm dans bash. Par conséquent, la taille totale indiquée par 

du -sh

ne correspond pas à la somme de l'utilisation du disque de chaque sous-répertoire, quand j'ai utilisé

du -sh *

Il m'a fallu un certain temps pour comprendre que Nautilus envoie les fichiers supprimés dans son dossier Corbeille et que ce dossier n'est pas répertorié dans la commande du -sh *. Donc, je voulais juste partager ceci, au cas où quelqu'un serait confronté au même problème. 

1
CrossEntropy

Hmm, le meilleur moyen est d'utiliser cette commande:

du -h -x / | sort -hr >> /home/log_size.txt

Vous pourrez alors obtenir des dossiers de toutes tailles sur l’ensemble de votre serveur. Facile à vous aider à trouver les plus grandes tailles.

1
Xanarus

Ce qui suit est facile à retenir 

ls -ltrapR

liste le contenu du répertoire

-l utilise un format de liste longue

-t trier par heure de modification, le plus récent en premier

-r, --reverse ordre inverse lors du tri

-a, --all ne pas ignorer les entrées commençant par.

-p, --indicator-style = slash ajouter/indicateur aux répertoires

-R, --recursive lister les sous-répertoires de manière récursive

https://explainshell.com/explain?cmd=ls+-ltrapR

0
Cryptopat

placer dans le script init comme .bashrc ... ajustez def au besoin.

duh() {
  # shows disk utilization for a path and depth level
  path="${1:-$PWD}"
  level="${2:-0}"
  du "$path" -h --max-depth="$level"
}
0
Goran B.

Si vous souhaitez davantage de contrôle sur la size pour laquelle vous souhaitez répertorier les répertoires, vous pouvez utiliser le commutateur threshold (-t) comme suit:

$ du -ht 1000000000 | sort --reverse

du - disk usage
h - format lisible par l'homme
t - taille de seuil

Ici, nous voulons lister tous les répertoires dont la taille est supérieure à 1 Go.

$ du -ht 1G | sort --reverse

Explication:

Les unités décrites dans le wiki sont les suivantes:

K, M, G, T, P, E, Z, Y (puissances de 1024) ou
KB, MB, GB, TB, PB, EB, ZB, YB (puissances de 1000).

0
kmario23

J'ai rencontré un problème similaire à celui décrit par Martin Wilde, dans mon cas, comparer le même répertoire sur deux serveurs différents après la mise en miroir avec rsync. 

Au lieu d'utiliser un script, j'ai ajouté l'indicateur -b à la du qui compte la taille en octets et, autant que je sache, a éliminé les différences sur les deux serveurs. Vous pouvez toujours utiliser -s -h pour obtenir une sortie compréhensible.

0
booltype