Dans une partition, j'ai plusieurs fichiers et dossiers, et je peux lister toutes les tailles de fichiers avec du
comme ceci:
du -h
Mais comment puis-je répertorier tous les fichiers dépassant une taille d'espace disque spécifique telle que 5 Mo?
Voici une solution simple dans bash, qui analyse la taille des fichiers et des dossiers:
#!/bin/bash
folder="$1"
limit="$2"
IFS=$'\n'
for item in `find "$folder"`; do
size=$(du -s "$item" | cut -f1)
if [ $size -gt $limit ]; then
echo $item
fi
done
premier paramètre est le dossier cible à examiner
second paramètre est la limite en kilooctets, où 1K = 1024 octets.
find /home/stephenm/ -maxdepth 1 -size +20k -exec du -h {} \;
Cela devrait lister tout ce qui dépasse 20k dans/home/stephenm
pour recurse dans des sous-répertoires, supprimez l’option -maxdepth 1
.
Attention: du
n'imprime pas la taille d'un fichier, il vous donne une estimation de l'utilisation de l'espace disque.
Vous pouvez créer un fichier de 10 Mo, qui utilise beaucoup moins:
dd if=/dev/zero of=file seek=10M count=1 bs=1
stat -c %s file
ls -lh file
du -h file
cat file | wc
Un exemple est un fichier compressé qui utilise moins d'espace sur le disque que sa taille, comme dans l'exemple ci-dessus d'un fichier fragmenté .
Dans l'exemple ci-dessus, find . -type f -size +5M
générera file
même si du
est bien inférieur à 5M.
Si vous savez que vos noms de fichiers ne contiennent pas de saut de ligne, vous pouvez filtrer la sortie de find
avec:
find . -type f -size +5M | while IFS= read -r file; do
du=$(du -k "$file")
size="${du%%$(printf "\t")*}"
if test $size -gt $((5 * 1024)); then
echo "$file"
fi
done
Si vous pouvez avoir des nouvelles lignes dans vos noms de fichiers, vous pouvez utiliser cette extension GNU, mais utiliser autre chose que echo
dans la boucle:
find . -type f -size +5M -print0 | while IFS= read -r -d '' file; do
du=$(du -k "$file")
size="${du%%$(printf "\t")*}"
if test $size -gt $((5 * 1024)); then
echo "$file"
fi
done