174 votes

Comment vérifier la taille d'un fichier?

J'ai un script qui vérifie pour les 0-taille, mais je pensais qu'il devait y avoir un moyen plus simple pour vérifier les tailles de fichier à la place. I. e. file.txt est normalement 100k; comment faire un script de vérifier si elle est à moins de 90k (y compris 0), et lui faire faire wget une nouvelle copie parce que le fichier est endommagé dans ce cas.

Ce que je suis en train de l'aide..

if [ -n file.txt ]
then
 echo "everything is good"
else
 mail -s "file.txt size is zero, please fix. " myemail@gmail.com < /dev/null
 # Grab wget as a fallback 
 wget -c https://www.server.org/file.txt -P /root/tmp --output-document=/root/tmp/file.txt
 mv -f /root/tmp/file.txt /var/www/file.txt
fi

310voto

Mikel Points 10000

[ -n file.txt ] ne vérifie pas sa taille, il vérifie que la chaîne de caractères file.txt est non-nul de la longueur, de sorte qu'il réussira toujours.

Si vous voulez dire "la taille est non-zéro", vous avez besoin d' [ -s file.txt ].

Pour obtenir un fichier de taille, vous pouvez utiliser wc -c pour obtenir la taille (longueur du fichier) en octets:

file=file.txt
minimumsize=90000
actualsize=$(wc -c "$file" | cut -f 1 -d ' ')
if [ $actualsize -ge $minimumsize ]; then
    echo size is over $minimumsize bytes
else
    echo size is under $minimumsize bytes
fi

Dans ce cas, il semble que c'est ce que vous voulez.

Mais pour info, si vous voulez savoir combien d'espace disque le fichier, vous pouvez utiliser du -k pour obtenir la taille (de l'espace disque utilisé) en kilo-octets:

file=file.txt
minimumsize=90
actualsize=$(du -k "$file" | cut -f 1)
if [ $actualsize -ge $minimumsize ]; then
    echo size is over $minimumsize kilobytes
else
    echo size is under $minimumsize kilobytes
fi

Si vous avez besoin de plus de contrôle sur le format de sortie, vous pouvez également chercher de l' stat. Sur Linux, vous auriez du commencer avec quelque chose comme stat -c '%s' file.txt, et BSD/Mac OS X, quelque chose comme stat -f '%z' file.txt.

21voto

fstab Points 562

solution alternative avec awk et double parenthèse:

FILENAME=file.txt
SIZE=$(du -sb $FILENAME | awk '{ print $1 }')

if ((SIZE<90000)) ; then 
    echo "less"; 
else 
    echo "not less"; 
fi

16voto

gniourf_gniourf Points 9393

Si votre find poignées de cette syntaxe, vous pouvez utiliser:

find -maxdepth 1 -name "file.txt" -size -90k

Cela permettra de sortie file.txt sur la sortie standard si et seulement si la taille de l' file.txt est à moins de 90k. Pour exécuter un script script si file.txt a une taille de moins de 90k:

find -maxdepth 1 -name "file.txt" -size -90k -exec script \;

14voto

BananaNeil Points 1351

Si vous êtes à la recherche pour juste la taille d'un fichier:

$ cat $file | wc -c
> 203233

4voto

mivk Points 1352

Pour obtenir la taille du fichier de Linux et de Mac OS X (et probablement d'autres systèmes Bsd), il n'y a pas beaucoup d'options, et la plupart de celles suggérées ici ne fonctionne que sur un seul système.

Compte tenu de f=/path/to/your/file,

ce qui fonctionne dans les deux Linux et Mac'Bash:

size=$( perl -e 'print -s shift' "$f" )

ou

size=$( wc -c "$f" | awk '{print $1}' )

Les autres réponses fonctionnent très bien sous Linux, mais pas sous Mac:

  • du n'ont pas d' -b option sous Mac, et de la taille de bloc=1 astuce ne fonctionne pas ("minimum la taille de bloc de 512", ce qui conduit à un mauvais résultat)

  • cut -d' ' -f1 ne fonctionne pas car sur Mac, le numéro peut être aligné à droite, matelassée, avec des espaces à l'avant.

Donc, si vous besoin de quelque chose de flexible, il est soit en perls' -s de l'opérateur ou d' wc -c courante à l' awk '{print $1}' (awk ignorer le premier espace blanc).

Et bien sûr, concernant le reste de votre question initiale, l'utilisation de l' -lt (ou -gt) opérateur :

if [ $size -lt $your_wanted_size ]; then etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X