web-dev-qa-db-fra.com

Tri récursif des fichiers selon leur taille

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.

86
user2179293

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

Décomposition de l'approche

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
98
slm

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
24
terdon

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
11
kenorb

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

7
Brad Parks

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).

5
Stéphane Chazelas

Solution simple pour Mac/Linux qui ignore les répertoires:

find . -type f -exec du -h {} \; | sort -h
4
mprcela

L'équivalent dans BSD ou OSX est

$ du -ah simpl | sort -dr | head -6
2
hanxue

Essayez la commande ci-dessous avec l'option de tri pour avoir des dossiers de taille croissante

du -sh * | sort -sh

1
Dhaval H. Nena

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

Solution de ligne de commande Linux

Renvoie récursivement toute la liste des seuls fichiers d'un répertoire, triés par taille de fichier

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

Comme précédemment, mais cette fois, renvoyez le plus gros fichier.

# 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}'

Même motif exact, mais sélectionnez maintenant le fichier le plus récent au lieu du plus grand

# (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:

  1. find: recherche récursivement tous les fichiers du répertoire actuel et les imprime avec un caractère nul
  2. xargs: utilitaire pour exécuter des commandes en utilisant des arguments fournis par l'entrée standard. Pour chaque ligne de sortie, nous voulons exécuter l'utilitaire stat sur ce fichier
  3. stat: Stat est une commande géniale qui a tellement de cas d'utilisation. J'imprime deux colonnes, la première colonne étant la taille du bloc (% s) et la deuxième colonne étant le nom du fichier (% n)
  4. tri: triez les résultats avec le commutateur numérique. Puisque le premier argument est un entier, nos résultats seront triés correctement
  5. tail: Sélectionnez uniquement la dernière ligne de sortie (puisque la liste est triée, c'est le plus gros fichier!)
  6. awk: sélectionnez la deuxième colonne, qui contient le nom de fichier, et qui est le plus gros fichier d'un répertoire récursif.

Solution Python

#!/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.

0
Luke Pafford

Variante de cette réponse d'une question similaire

find . -type f -exec du -ah {} + | sort -rh | more
0
crizCraig