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!
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).
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
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.
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.
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ù,
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 }'
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.
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é.
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 questat
a des paramètres différents en fonction du système d’exploitation. Cependant, la deuxième commande fonctionnant correctement sur OSX/BSD (commesort
n'a pas-h
), installezsort
à partir decoreutils
ou supprimez-h
dels
et utilisezsort -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'
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
du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1
ou
du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'
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
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
.
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
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