J'ai besoin de trouver les fichiers les plus volumineux dans un dossier.
Comment numériser un dossier récursivement et trier le contenu par taille?
J'ai essayé d'utiliser ls -R -S
, mais cela répertorie également les répertoires.
J'ai également essayé d'utiliser find
.
Vous pouvez également le faire avec simplement du
. Pour être sûr, j'utilise cette version de du
:
$ du --version
du (GNU coreutils) 8.5
L'approche:
$ du -ah ..DIR.. | grep -v "/$" | sort -rh
La commande du -ah DIR
produira une liste de tous les fichiers et répertoires d'un répertoire donné DIR
. Le -h
produira des tailles lisibles par l'homme que je préfère. Si vous ne les voulez pas, supprimez ce commutateur. J'utilise le head -6
juste pour limiter la quantité de sortie!
$ du -ah ~/Downloads/ | head -6
4.4M /home/saml/Downloads/Kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K /home/saml/Downloads/Kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M /home/saml/Downloads/Kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M /home/saml/Downloads/Kodak_W820_wireless_frame
8.0K /home/saml/Downloads/bugs.xls
604K /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf
Assez facile à trier du plus petit au plus gros:
$ du -ah ~/Downloads/ | sort -h | head -6
0 /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock
Inversez-le, du plus grand au plus petit:
$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G /home/saml/Downloads/audible/audio_books
3.8G /home/saml/Downloads/audible
2.3G /home/saml/Downloads/apps_archive
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.Zip
1.5G /home/saml/Downloads/digital_blasphemy
Ne me montrez pas le répertoire, juste les fichiers:
$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6
3.8G /home/saml/Downloads/audible/audio_books
3.8G /home/saml/Downloads/audible
2.3G /home/saml/Downloads/apps_archive
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.Zip
1.5G /home/saml/Downloads/digital_blasphemy
835M /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
Si vous voulez simplement la liste des plus petits aux plus grands, mais que les 6 premiers fichiers incriminés, vous pouvez inverser le commutateur de tri, supprimez (-r
), et utilise tail -6
à la place du head -6
.
$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G /home/saml/Downloads/digital_blasphemy
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.Zip
2.3G /home/saml/Downloads/apps_archive
3.8G /home/saml/Downloads/audible
3.8G /home/saml/Downloads/audible/audio_books
Si vous souhaitez rechercher tous les fichiers dans le répertoire courant et ses sous-répertoires et les répertorier en fonction de leur taille (sans tenir compte de leur chemin d'accès), et en supposant qu'aucun des noms de fichier ne contient de caractères de nouvelle ligne, avec GNU = find
, vous pouvez le faire:
find . -type f -printf "%s\t%p\n" | sort -n
De man find
sur un système GNU:
-printf format
True; print format on the standard output,
interpreting `\' escapes and `%' directives.
Field widths and precisions can be specified
as with the `printf' C function. Please note
that many of the fields are printed as %s
rather than %d, and this may mean that flags
don't work as you might expect. This also
means that the `-' flag does work (it forces
fields to be left-aligned). Unlike -print,
-printf does not add a newline at the end of
the string. The escapes and directives are:
%p File's name.
%s File's size in bytes.
De man sort
:
-n, --numeric-sort
compare according to string numerical value
Essayez la commande suivante:
ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20
Il listera récursivement les 20 plus gros fichiers du répertoire actuel.
Remarque: l'option -h
pour sort
n'est pas disponible sur OSX/BSD, vous devez donc installer sort
à partir de coreutils
(par exemple via brew
) et appliquer le code local chemin bin vers PATH
, par exemple.
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
Vous pouvez également utiliser:
ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20
Pour les plus gros répertoires, utilisez du
, par exemple:
du -ah . | sort -rh | head -20
ou:
du -a . | sort -rn | head -20
Cela trouvera tous les fichiers de manière récursive et les triera par taille. Il imprime toutes les tailles de fichiers en ko et arrondit pour que vous puissiez voir des fichiers de 0 Ko, mais il était suffisamment proche pour mes utilisations et fonctionne sur OSX.
find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1
Avec zsh
, vous trouverez le plus gros fichier (en termes de taille apparente comme la colonne de taille dans ls -l
sortie, pas d'utilisation du disque) avec:
ls -ld -- **/*(DOL[1])
Pour les 6 plus grands:
ls -ld -- **/*(DOL[1,6])
Pour les trier par taille de fichier, vous pouvez utiliser ls
's -S
option. Certaines implémentations ls
ont également un -U
option pour ls
de ne pas trier la liste (car elle est déjà triée par taille par zsh
ici).
Solution simple pour Mac/Linux qui ignore les répertoires:
find . -type f -exec du -h {} \; | sort -h
L'équivalent dans BSD
ou OSX
est
$ du -ah simpl | sort -dr | head -6
Essayez la commande ci-dessous avec l'option de tri pour avoir des dossiers de taille croissante
du -sh * | sort -sh
Il s'agit d'un besoin incroyablement commun pour diverses raisons (j'aime trouver la sauvegarde la plus récente dans un répertoire), et c'est une tâche étonnamment simple.
Je vais fournir une solution Linux qui utilise les utilitaires find, xargs, stat, tail, awk et sort.
La plupart des gens ont fourni des réponses uniques, mais je préfère la mienne car elle gère correctement les noms de fichiers et le cas d'utilisation peut facilement être changé (modifier les statistiques et trier les arguments)
Je fournirai également une solution Python qui devrait vous permettre d'utiliser cette fonctionnalité même sous Windows
find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n
# Each utility is split on a new line to help
# visualize the concept of transforming our data in a stream
find . -type f -print0 |
xargs -0 -I{} stat -c '%s %n' {} |
sort -n |
tail -n 1 |
awk '{print $2}'
# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} |
sort -n | tail -n 1 | awk '{print $2}'
Explication:
#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
for filename in filenames:
realpath = os.path.join(dirpath, filename)
files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)
Ce script prend un peu plus de temps à expliquer, mais essentiellement si vous l'enregistrez en tant que script, il recherchera le premier argument fourni sur la ligne de commande et renverra le plus gros fichier de ce répertoire. Le script ne vérifie pas les erreurs, mais il devrait vous donner une idée de la façon d'aborder cela en Python, ce qui vous donne une manière indépendante de la plate-forme Nice de résoudre ce problème.
Variante de cette réponse d'une question similaire
find . -type f -exec du -ah {} + | sort -rh | more