Comment trouver le plus gros fichier dans un répertoire et ses sous-répertoires?


102

Nous commençons juste une classe UNIX et apprenons une variété de commandes Bash. Notre mission consiste à exécuter diverses commandes sur un répertoire contenant également un certain nombre de dossiers.

Je sais comment lister et compter tous les fichiers normaux du dossier racine en utilisant:

find . -type l | wc -l

Mais j'aimerais savoir où aller à partir de là pour trouver le plus gros fichier de tout le répertoire. J'ai vu quelque chose concernant une ducommande, mais nous ne l'avons pas appris, donc dans le répertoire des choses que nous avons apprises, je suppose que nous devons en quelque sorte la connecter à la ls -tcommande.

Et pardonnez-moi si mon «jargon» n'est pas correct, je m'y habitue encore!


2
Si vous connaissez une commande, mais que vous ne savez pas comment l'utiliser, essayez de taper mansuivi de la commande qui vous intéresse. Up affichera une belle entrée manuelle pour cette commande (appuyez sur qpour revenir à la ligne de commande).
Dunes

Réponses:


126

Citation de ce lien-

Si vous souhaitez rechercher et imprimer les 10 plus grands noms de fichiers (pas de répertoires) dans un répertoire particulier et ses sous-répertoires

$ find . -printf '%s %p\n'|sort -nr|head

Pour restreindre la recherche au répertoire actuel, utilisez "-maxdepth 1" avec find.

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

Et pour imprimer les 10 plus grands "fichiers et répertoires":

$ du -a . | sort -nr | head

** Utilisez "head -n X" au lieu du seul "head" ci-dessus pour imprimer les X plus gros fichiers (dans tous les exemples ci-dessus)


1
Pourquoi "du -a. | Sort -nr | head" renvoie le double du nombre de Ko que la taille réelle du fichier?
xxjjnn

6
Ah, vous devez ajouter l'option «k» ou elle affiche des multiples de 512 octets plutôt que de 1024. du -ak
xxjjnn

2
pour le premier, comment obtenir la taille dans un format lisible par l'homme?
Bluz

@Bluz Je vais essayer de remplacer '%s %p\n'avec '%p\n'et en ajoutant |xargs ls -lhà la fin
Duncan X Simpson

6
La première solution ne fonctionne pas sur OS X pour moi, donc je fini par utiliser un hack rapide pour filtrer les répertoires de la troisième solution: du -am . | sort -nr | grep '\..*\.' | head. Le mest d'afficher la taille du fichier en mégaoctets et utilisé greppour afficher les lignes avec au moins deux points, le premier est dans le ./dans le chemin, le second est dans l'extension de fichier, par exemple .mov.
psmith

63

Pour trouver les 25 premiers fichiers dans le répertoire actuel et ses sous-répertoires:

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

Cela affichera les 25 premiers fichiers en les triant en fonction de la taille des fichiers via la commande piped "sort -nr -k5".

Idem mais avec des tailles de fichier lisibles par l'homme:

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25


10
find . -type f | xargs ls -lS | head -n 1

les sorties

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

Si vous voulez juste le nom du fichier:

find . -type f | xargs ls -1S | head -n 1

Cela évite d'utiliser awket vous permet d'utiliser les indicateurs que vous voulez ls.

Mise en garde . Parce que xargstente d'éviter de construire des lignes de commande trop longues, cela peut échouer si vous l'exécutez sur un répertoire avec beaucoup de fichiers car lsfinit par s'exécuter plus d'une fois. Ce n'est pas un problème insurmontable (vous pouvez collecter la head -n 1sortie de chaque lsinvocation et l'exécuter à ls -Snouveau, en boucle jusqu'à ce que vous ayez un seul fichier), mais cela gâche quelque peu cette approche.


je suis désolé xargs, je t'ai négligé +1
Steve

2
pour gérer les noms de fichiers avec des espaces, utilisezfind . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo

Cela trouve les fichiers les plus volumineux uniquement dans le premier lot xargsexécuté. Pour corriger le tri ajouter: find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10. J'ai travaillé sur OSX pour moi.
psmith

10

Il n'y a pas de commande simple disponible pour trouver les plus gros fichiers / répertoires sur un système de fichiers Linux / UNIX / BSD. Cependant, la combinaison des trois commandes suivantes (à l'aide de tubes) vous permet de trouver facilement la liste des fichiers les plus volumineux:

# du -a /var | sort -n -r | head -n 10

Si vous voulez une sortie plus lisible par l'homme, essayez:

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

Où,

  • Var est le répertoire que vous souhaitez rechercher
  • du commande option -h: affiche les tailles dans un format lisible par l'homme (par exemple, 1K, 234M, 2G).
  • du commande option -s: afficher uniquement un total pour chaque argument (résumé).
  • du commande option -x: sauter les répertoires sur différents systèmes de fichiers.
  • Commande de tri option -r: inverser le résultat des comparaisons.
  • commande de tri option -h: compare les nombres lisibles par l'homme. Il s'agit uniquement d'une option spécifique au tri GNU.
  • head commande -10 OU option -n 10: affiche les 10 premières lignes.

J'aime mieux la 2ème commande mais sur osx, pas d'option -h pour la version de tri installée. Devrait être pour mac: du -hsx * | sort -rn | head -10
Yann VR

1
J'adore cette deuxième commande! Le meilleur de tous ceux que j'ai essayés - je vais le garder pour plus tard.
CodeMouse92


8

Cela répertorie les fichiers de manière récursive s'ils sont des fichiers normaux, les trie par le 7ème champ (qui est la taille dans ma findsortie; vérifiez le vôtre) et n'affiche que le premier fichier.

find . -type f -ls | sort +7 | head -1

La première option findest le chemin de départ de la recherche récursive. Un type de frecherche de fichiers normaux. Notez que si vous essayez d'analyser cela en tant que nom de fichier, vous risquez d'échouer si le nom de fichier contient des espaces, des retours à la ligne ou d'autres caractères spéciaux. Les options sortvarient également selon le système d'exploitation. J'utilise FreeBSD.

Une solution "meilleure" mais plus complexe et plus lourde serait de findparcourir les répertoires, mais peut-être utiliser statpour obtenir les détails sur le fichier, puis peut-être utiliser awkpour trouver la plus grande taille. Notez que la sortie de statdépend également de votre système d'exploitation.


1
Que doit faire l' +7argument? Sur ma machine, sort se plaint simplement de ne pas trouver un fichier appelé +7.
Dunes

@Dunes - Comme je l'ai dit, consultez la page de manuel de sortvotre système. J'utilise OS X 10.4 pour le moment, où l'utilisation dérive du tri de FreeBSD : sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]... Notez le +POS [-POS2]. Cela fonctionne également dans les versions actuelles de FreeBSD.
ghoti

2
Il semble que vous ayez un programme de tri différent de moi. Ceci est la page de manuel de mon programme de tri - linux.die.net/man/1/sort Pour que cela fonctionne sur ma machine, vous devez utiliser explicitement -karg, par exemple. sort -k 7. edit: par OSX 10.5, la page de manuel pour le tri semble avoir changé pour la version que j'ai.
Dunes

1
@Dunes - Tout est du genre GNU, mais des versions différentes. La [+POS1] [-POS2]notation est juste une ancienne. Pour autant que je sache, cette notation est toujours supportée par le tri GNU moderne, bien que maintenant que je regarde, il semble avoir été supprimé de la page de manuel de tri après la version 5.1. Vous pouvez le voir dans la page de manuel pour le tri pour FreeBSD 4.11 . Je suppose que je n'ai pas lu la page de manuel de sort depuis la sortie de FreeBSD 5.0!
ghoti du

Notez également que +POS1compte les paramètres de tri à partir de zéro, tandis que les paramètres de tri sont comptés à partir -k POS1de un.
ghoti du

6

Cela trouvera le plus grand fichier ou dossier dans votre répertoire de travail actuel:

ls -S /path/to/folder | head -1

Pour trouver le plus gros fichier dans tous les sous-répertoires:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'

Je pense que le comportement par défaut de ls est de lister les fichiers dans des colonnes (c'est-à-dire plusieurs entrées par ligne), donc le premier ne trouve pas exactement le plus gros fichier. En ce qui concerne votre deuxième commande, il n'a trouvé que le plus gros fichier dans le répertoire donné et non ses sous-répertoires.
Dunes

@Dunes: Vous avez raison, la première commande pourrait trouver des répertoires, mais pas à cause du comportement par défaut de ls. Dans mes tests, le -Sdrapeau listera un fichier par ligne. J'ai corrigé la deuxième commande. J'espère que maintenant c'est la preuve complète. Je vous remercie.
Steve

4

Sur Solaris, j'utilise:

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

ou

find . -type f -ls | sort -nrk7 | head -1 #unformatted

parce que tout ce qui est publié ici n'a pas fonctionné Cela trouvera le plus gros fichier dans $PWDet sous-répertoires.


2

Essayez le one-liner suivant (affichez les 20 plus gros fichiers):

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

ou (tailles lisibles par l'homme):

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Fonctionne très bien sous Linux / BSD / OSX par rapport à d'autres réponses, car l' -printfoption find n'existe pas sur OSX / BSD et stata des paramètres différents selon le système d'exploitation. Cependant , la deuxième commande fonctionne sur OSX / BSD correctement (comme sortne pas -h), installer à sortpartir coreutilsou supprimer à -hpartir lset à utiliser à la sort -nrplace.

Donc, ces alias sont utiles à avoir dans vos fichiers rc :

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

Cela n'affiche que le nom du fichier sans le chemin, donc n'aide pas vraiment à trouver le plus gros fichier.
psmith du

Pour moi en haut, j'ai des fichiers vraiment plus gros, mais à la fin, cela ne me donne pas les bons fichiers
Borislav Markov

2

Essayez la commande suivante:

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

Cela imprimera le plus grand nom et taille de fichier et plus de 500M. Vous pouvez déplacer le if($1 > 500000), et il imprimera le plus gros fichier du répertoire.


1

du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

ou

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'


0

Ce script simplifie la recherche des fichiers les plus volumineux pour une action ultérieure. Je le garde dans mon répertoire ~ / bin et mets ~ / bin dans mon $ PATH.

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size

0

C'est une manière assez simple de le faire:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

Et vous aurez ceci: 8445 examples.desktop


Que 1***doit-on faire à la fin? J'obtiens une erreur "aucune correspondance trouvée" pour cet argument.
user4815162342

0

Solution Linux: Par exemple, vous voulez voir la liste de tous les fichiers / dossiers de votre répertoire personnel (/) en fonction de la taille du fichier / dossier ( ordre décroissant ).

sudo du -xm / | sort -rn | plus


0

Pour répertorier le fichier le plus volumineux dans un dossier

ls -sh /pathFolder | sort -rh | head -n 1

La sortie de ls -shest une vue dimensionnée set hcompréhensible par l' homme du numéro de taille du fichier.

Vous pourriez utiliser ls -shS /pathFolder | head -n 1. Le plus grand Sdes lsordonne déjà la liste des plus gros fichiers aux plus petits, mais le premier résultat est la somme de tous les fichiers dans ce dossier. Donc, si vous voulez simplement lister le plus gros fichier, un fichier, vous devez head -n 2vérifier le "résultat de la deuxième ligne" ou utiliser le premier exemple avec ls sort head.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.