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

nous commençons juste une classe UNIX et nous apprenons une variété de commandes Bash. Notre tâche consiste à exécuter diverses commandes sur un répertoire qui contient également un certain nombre de dossiers.

je sais comment répertorier et compter tous les fichiers réguliers 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 l'annuaire. J'ai vu des choses au sujet d'une Commande du , mais nous n'avons pas appris cela, donc dans le répertoire des choses que nous avons apprises, je suppose que nous devons d'une façon ou d'une autre la relier à la commande ls -t .

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

89
demandé sur ronalchn 2012-09-21 03:15:25

14 réponses

citation de ce lien -

si vous voulez trouver et imprimer les 10 plus grands noms de fichiers (pas répertoires) dans un répertoire 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 d'imprimer le top 10 plus grand "fichiers et répertoires":

$ du -a . | sort -nr | head

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

115
répondu tamsler 2012-09-20 23:34:29

pour trouver les 25 premiers fichiers du répertoire courant et de 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" sort-nr-k5".

même si les formats de fichier sont lisibles par l'utilisateur:

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

56
répondu xpros 2018-06-21 01:56:30
find . -type f | xargs ls -lS | head -n 1

sorties

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

si vous voulez simplement le nom du fichier:

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

Cela évite d'utiliser awk et vous permet d'utiliser tous les indicateurs que vous souhaitez dans ls .

mise en garde . Parce que xargs essaie d'éviter de construire des lignes de commande trop longues, cela pourrait échouer si vous l'exécutez sur un répertoire avec beaucoup de fichiers parce que ls finit par exécuter plus qu'une fois. Ce n'est pas un problème insurmontable (vous pouvez collecter la sortie head -n 1 de chaque ls invocation, et lancer ls -S à nouveau, en boucle jusqu'à ce que vous ayez un seul fichier), mais il fait mar cette approche un peu.

10
répondu nneonneo 2012-09-21 03:55:32

cette liste de fichiers récursivement s'il s'agit de fichiers normaux, trie par le 7ème Champ (qui est la taille dans ma sortie find ; vérifiez la vôtre), et affiche seulement le premier fichier.

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

la première option de find est le chemin de démarrage pour la recherche récursive. A-type de f recherche des fichiers normaux. Notez que si vous essayez d'analyser ceci comme un nom de fichier, vous pouvez échouer si le nom de fichier contient des espaces, des lignes ou d'autres caractères spéciaux. Le les options de sort varient également selon le système d'exploitation. Je suis sous FreeBSD.

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

8
répondu ghoti 2012-09-20 23:20:50

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 (en utilisant des pipes) vous pouvez facilement trouver la liste des plus grands fichiers:

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

si vous voulez plus de sortie lisible par l'utilisateur essayez:

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

où,

  • Var est le répertoire que vous wan pour la recherche
  • du command-h option: tailles d'affichage dans un format lisible par l'homme (par exemple, 1K, 234M, 2G).
  • du commande -option s : montrent qu'un total pour chaque argument (résumé).
  • du commande -option x : ignorer les répertoires d' différents systèmes de fichiers.
  • tri Commande-R option: inverser le résultat des comparaisons.
  • commande de tri option-h : comparer lisible par l'homme nombre. C'est L'option spécifique GNU sort seulement.
  • commande principale -10 ou-n 10 option: afficher les 10 premières lignes.
7
répondu Kalpana 2014-05-26 09:34:26

vous trouverez le plus grand fichier ou dossier dans votre répertoire de travail actuel:

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

pour trouver le plus grand fichier dans tous les sous-répertoires:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { =""; sub(/^ /, ""); print }'
6
répondu Steve 2012-09-21 00:59:32

Sur Solaris-je utiliser:

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

ou

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

parce que tout ce qui est posté ici n'a pas fonctionné. Ce sera le plus grand fichier dans $PWD et sous-répertoires.

3
répondu rindeal 2013-11-22 09:45:07

essayez la doublure suivante (display top-20 biggest files):

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

ou (lisible tailles):

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

fonctionne bien sous Linux/BSD/OSX par rapport à d'autres réponses, car l'option -printf de find n'existe pas sur OSX/BSD et stat a des paramètres différents selon OS. Cependant la deuxième commande pour travailler correctement sur OSX/BSD (comme sort n'a pas -h ), installez sort de coreutils ou supprimer -h de ls et utiliser sort -nr à la place.

donc ces alias sont utiles pour avoir dans vos rc fichiers:

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'
3
répondu kenorb 2015-03-05 12:49:43

essayez la commande suivante:

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

cela imprimera le plus grand nom de fichier et la taille et plus de 500M. Vous pouvez déplacer le if( > 500000) , et il affichera le plus grand fichier du répertoire.

2
répondu zjhui 2017-06-15 06:36:24

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

ou

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

1
répondu Ansgar Wiechers 2012-09-20 23:33:06

Solution Linux: par exemple, vous voulez voir tous les fichiers/la liste des dossiers de votre maison (/) répertoire selon la taille du fichier/dossier ( ordre descendant ).

sudo du-xm / / sort-rn | more

1
répondu Monir 2017-03-03 21:05:14

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

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

# This finds files of size >=  (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

# /q/how-to-define-hash-tables-in-bash-49174/"" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: "151900920" [{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 "" ]; 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=; fn=; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 
main $size
0
répondu jlettvin 2014-01-22 07:41:24

Qui est assez moyen plus 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

0
répondu tieorange 2015-06-05 14:25:12

pour lister le plus grand fichier dans un dossier

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

la sortie de ls -sh est une taille s et humaine h vue compréhensible du numéro de taille de fichier.

vous pouvez utiliser ls -shS /pathFolder | head -n 1 . Le plus grand S de ls commande 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 juste lister le plus gros fichier, un file, vous devez head -n 2 et vérifier le" résultat de la deuxième ligne "ou utiliser le premier exemple avec ls sort head .

0
répondu José Pacheco 2018-03-08 18:22:28