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

7

Dans une partition, j'ai plusieurs fichiers et dossiers, et je peux répertorier toutes les tailles de fichiers avec du comme ceci:

du -h

Mais comment puis-je répertorier tous les fichiers dont la taille dépasse 5 Mo?

    
posée Ten-Coin 27.12.2012 - 13:07
la source

3 réponses

0

Voici une solution simple en bash, qui analyse la taille des fichiers et des dossiers:

#!/bin/bash

folder=""
limit=""

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 est le dossier cible à examiner
deuxième paramètre est la limite en kilo-octets, où 1K = 1024 octets.

    
réponse donnée Pavel A 27.12.2012 - 13:46
la source
10
find /home/stephenm/ -maxdepth 1 -size +20k -exec du -h {} \;

Cela devrait lister plus de 20k dans / home / stephenm

pour rentrer dans les sous-répertoires, supprimez l’option -maxdepth 1 .

    
réponse donnée stedotmartin 27.12.2012 - 13:19
la source
1

Faites attention: du n'imprime pas la taille d'un fichier, il vous donne une estimation de l'utilisation de l'espace fichier.

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, un fichier fragmenté .

Dans l'exemple ci-dessus, find . -type f -size +5M affichera file même si du est bien inférieur à 5M.

Si vous savez que vous n’avez pas de nouvelles lignes dans vos noms de fichiers, 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 ensuite 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
    
réponse donnée jfg956 27.12.2012 - 18:34
la source

Lire d'autres questions sur les étiquettes