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.
Essayez quelque chose comme:
du -sh *
version courte de:
du --summary --human-readable *
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)
du -sk * | sort -n
va trier les dossiers par taille. Utile lorsqu'on cherche à libérer de l'espace ..
du -sh * | sort -h
Cela sera affiché dans un format lisible par l'homme.
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 :)
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
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.)
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
.
du -h --max-depth=1 . | sort -n -r
J'utilise toujours du -sk
(drapeau -k
indiquant la taille du fichier en kilo-octets) à la place.
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
du -sch * dans le même répertoire.
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
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).
regardez la commande du
pour cela
du -sm * | trier -nr
Sortie par taille
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"
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:
Ensuite, j'entre en bas à droite de mon clavier pour aller dans le dossier /drivers
et je vois:
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 .
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.
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.
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
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"
}
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
- d
isk u
sageh
- format lisible par l'hommet
- 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).
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.