web-dev-qa-db-fra.com

Bash - Comment trouver le fichier le plus volumineux d’un répertoire et de ses sous-répertoires?

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

Je sais comment répertorier 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 fichier le plus volumineux de tout le répertoire. J'ai déjà vu quelque chose concernant une commande du, mais nous ne l'avons pas appris. Je suppose donc que, dans le répertoire des choses que nous avons apprises, nous devons le connecter d'une manière ou d'une autre à la commande ls -t.

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

91
Rekson

Citation de this link-

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

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

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

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

Et pour imprimer les 10 plus gros "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).

117
tamsler

Pour rechercher les 25 premiers fichiers du répertoire actuel et de ses sous-répertoires:

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

Les 25 premiers fichiers seront triés en fonction de leur taille 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

56
xpros
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 de fichier:

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

Ceci évite d’utiliser awk et vous permet d’utiliser les indicateurs de votre choix dans ls.

Caveat . Étant donné que xargs tente d'éviter de créer des lignes de commande trop longues, cela peut échouer si vous l'exécutez dans un répertoire contenant beaucoup de fichiers, car ls s'exécute plusieurs fois. Ce n'est pas un problème insurmontable (vous pouvez collecter le résultat head -n 1 de chaque invocation ls et exécuter à nouveau ls -S, en boucle jusqu'à ce que vous ayez un seul fichier), mais cela gâche quelque peu cette approche.

10
nneonneo

Cela répertorie les fichiers de manière récursive s'il s'agit de fichiers normaux, trie par 7e champ (taille dans ma sortie find; vérifiez le vôtre) et affiche uniquement le premier fichier.

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

La première option de find est le chemin de départ de la recherche récursive. Un type de f recherche les fichiers normaux. Notez que si vous essayez d'analyser cela en tant que nom de fichier, vous pouvez échouer si le nom de fichier contient des espaces, des nouvelles lignes ou d'autres caractères spéciaux. Les options de sort varient également selon le système d'exploitation. J'utilise FreeBSD.

Une solution "meilleure" mais plus complexe et plus lourde serait de faire parcourir les répertoires par find, mais peut-être utiliser stat pour obtenir les détails du fichier, puis peut-être utiliser awk pour trouver la plus grande taille. Notez que la sortie de stat dépend également de votre système d'exploitation.

8
ghoti

Il n’existe pas de commande simple permettant de connaître les fichiers/répertoires les plus volumineux d’un système de fichiers Linux/UNIX/BSD. Cependant, en combinant les trois commandes suivantes (à l'aide de tubes), vous pouvez facilement trouver 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 -h option: tailles d'affichage au format lisible par l'homme (par exemple, 1K, 234M, 2G). 
  • du commande option -s: affiche uniquement un total pour chaque argument (résumé). 
  • du commande option -x: skip répertoires sur des systèmes de fichiers différents
  • option de commande -r de tri: inverse le résultat des comparaisons. 
  • Commande de tri option -h: compare les nombres lisibles par l'homme. C'est GNU une option spécifique au tri seulement. 
  • commande principale -10 OR option -n 10: affiche les 10 premières lignes.
7
Kalpana

Ceci trouvera le plus gros fichier ou dossier de votre répertoire de travail actuel:

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

Pour trouver le fichier le plus volumineux de tous les sous-répertoires:

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

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 a été posté ici n'a pas fonctionné ... Ceci trouvera le plus gros fichier dans $PWD et ses sous-répertoires.

3
rindeal

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 nom de fichier le plus grand et la taille la plus large, et plus de 500Mo. Vous pouvez déplacer le if($1 > 500000) et le plus gros fichier du répertoire sera imprimé.

2
zjhui

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’option -printf de find n’existe pas sur OSX/BSD et que stat a des paramètres différents en fonction du système d’exploitation. Cependant, la deuxième commande fonctionnant correctement sur OSX/BSD (comme sort n'a pas -h), installez sort à partir de coreutils ou supprimez -h de ls et utilisez sort -nr à la place.

Il est donc utile d’avoir ces alias 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'
2
kenorb

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

Sudo du -xm/| trier -rn | plus

1
Monir

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

ou

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

1
Ansgar Wiechers

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
jlettvin

Pour répertorier le fichier plus volumineux dans un dossier 

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

La sortie de ls -sh est une vue compréhensible de taille s et humaine h du nombre de taille de fichier. 

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

0
José Pacheco
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
0
Borislav Markov

C'est une façon assez simple de le faire:

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

Et vous obtiendrez ceci: 8445 examples.desktop