web-dev-qa-db-fra.com

Comment puis-je répertorier tous les fichiers et dossiers au-delà d'une limite de taille spécifiée?

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?

7
rɑːdʒɑ

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.

0
Pavel A
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.

10
0x7c0

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
1
jfg956