J'ai un script qui vérifie la taille 0, mais je pensais qu'il devait y avoir un moyen plus simple de vérifier la taille des fichiers à la place. Ie file.txt
vaut normalement 100k; comment faire vérifier un script s'il est inférieur à 90k (y compris 0), et lui faire en obtenir une nouvelle copie car le fichier est corrompu dans ce cas.
Ce que j'utilise actuellement.
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
Réponses:
[ -n file.txt ]
ne vérifie pas sa taille, il vérifie que la chaînefile.txt
est de longueur non nulle, donc elle réussira toujours.Si vous voulez dire "la taille est différente de zéro", vous en avez besoin
[ -s file.txt ]
.Pour obtenir la taille d'un fichier, vous pouvez utiliser
wc -c
pour obtenir la taille (longueur du fichier) en octets: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 utilise, vous pouvez utiliser
du -k
pour obtenir la taille (espace disque utilisé) en kilo-octets:Si vous avez besoin de plus de contrôle sur le format de sortie, vous pouvez également consulter
stat
. Sous Linux, vous commenceriez par quelque chose commestat -c '%s' file.txt
, et sur BSD / Mac OS X, quelque chose commestat -f '%z' file.txt
.la source
du -b "$file" | cut -f 1
au lieu destat -c '%s' "$file"
? Oustat --printf="%s" "$file"
?stat
ont des indicateurs différents.... | cut -d' ' -f1
pour le faire fonctionner sur Ubuntu.wc -c < "$file"
(notez le<
), auquel cas vous n'avez pas besoin de la| cut ...
pièce (qui, telle que publiée, ne fonctionne pas sous OSX). LaBLOCKSIZE
valeur minimale pourdu
sur OSX est512
.wc -c <filename
utilise égalementfstat
etseek
? Notez que celafstat
prend un fd, pas un chemin.Cela me surprend que personne n'ait mentionné
stat
de vérifier la taille du fichier. Certaines méthodes sont certainement meilleures: utiliser-s
pour savoir si le fichier est vide ou non est plus facile que toute autre chose si c'est tout ce que vous voulez. Et si vous voulez trouver des fichiers d'une taille, alorsfind
c'est certainement la voie à suivre.J'aime aussi
du
beaucoup obtenir la taille du fichier en ko, mais, pour les octets, j'utiliseraisstat
:la source
stat
est une excellente idée, mais sur CentOS, c'est ce qui a fonctionné pour moi:size=$(stat -c%s $filename)
stat
que c'est la bonne chose dans certaines situations, et les fichiers épars ne sont pas pertinents dans la plupart des situations, mais certainement pas toutes.solution alternative avec awk et double parenthèse:
la source
du
ne prend pas en charge-b
. (Il peut être un choix de style conscient, mais juste de mentionner l'alternative: vous pouvez omettre l'$
intérieur du préfixe(( ... ))
lorsque les variables faisant référence:((SIZE<90000))
)$
awk
en utilisantread
(bash
commande interne):read SIZE _ <<<$(du -sb "$FILENAME")
Si votre
find
gère cette syntaxe, vous pouvez l'utiliser:Cela sortira
file.txt
vers stdout si et seulement si la taille defile.txt
est inférieure à 90k. Pour exécuter un scriptscript
s'ilfile.txt
a une taille inférieure à 90k:la source
find . -maxdepth 1 -name "file.txt" -size -90k
Si vous recherchez uniquement la taille d'un fichier:
la source
wc -c "$file"
a été donnée comme réponse en 2011 (il y a trois ans). Oui,wc -c "$file"
a le problème qu'il génère le nom du fichier ainsi que le nombre de caractères, de sorte que les premières réponses ont ajouté une commande pour séparer le nombre. Maiswc -c < "$file"
, qui corrige ce problème, a été ajouté en tant que commentaire en mai 2014. Votre réponse est équivalente à cela, sauf qu'elle ajoute une «utilisation inutile decat
» . De plus, vous devez citer toutes les références de variables shell sauf si vous avez une bonne raison de ne pas le faire.Cela fonctionne à la fois sous Linux et MacOS
la source
stat semble faire cela avec le moins d'appels système:
la source
strace du --bytes $1 2>&1 >/dev/null | wc
Si tel est le cas, alors sur l'architecture amd64 sur ArchLinux (généralement les dernières versions de tout) j'ai 45 lignes pourdu
, 46 lignes pourstat
, 47 lignes pourwc
et 72 lignes pourfind
.portable, toutes les saveurs de python, évite les variations dans les dialectes statistiques
la source
Pour obtenir la taille du fichier sous Linux et Mac OS X (et probablement dans d'autres BSD), il n'y a pas beaucoup d'options, et la plupart de celles suggérées ici ne fonctionneront que sur un seul système.
Étant donné
f=/path/to/your/file
,qu'est-ce qui fonctionne sous Linux et Mac 's Bash:
ou
Les autres réponses fonctionnent bien sous Linux, mais pas sous Mac:
du
n'a pas d'-b
option sous Mac, et l'astuce BLOCKSIZE = 1 ne fonctionne pas ("la taille minimale du bloc est de 512", ce qui conduit à un résultat erroné)cut -d' ' -f1
ne fonctionne pas car sur Mac, le nombre peut être aligné à droite, rempli d'espaces devant.Donc, si vous avez besoin de quelque chose de flexible, il s'agit soit
perl
de l '-s
opérateur, soit de lawc -c
redirection versawk '{print $1}'
(awk ignorera le premier espace blanc).Et bien sûr, concernant le reste de votre question initiale, utilisez l' opérateur
-lt
(ou-gt
):if [ $size -lt $your_wanted_size ]; then
etc.la source
size=$(wc -c < "$f")
(notez le<
, ce qui faitwc
rapporter uniquement un nombre). Re comparaison: n'oubliez pas le plus "bash-ful"if (( size < your_wanted_size )); then ...
(et aussi[[ $size -lt $your_wanted_size ]]
).D'après la réponse de gniourf_gniourf,
écrira
file.txt
dans stdout si et seulement si la taille defile.txt
est inférieure à 90 Ko, etexécutera la commande
command
sifile.txt
sa taille est inférieure à 90 Ko. J'ai testé cela sur Linux. Defind(1)
,(italiques ajoutés).
la source
en supposant que la commande ls rapporte la taille du fichier à la colonne # 6
la source
J'utiliser
du
« s--threshold
pour cela. Je ne sais pas si cette option est disponible dans toutes les versions de,du
mais elle est implémentée dans la version de GNU.Citant le manuel de du (1) :
Voici ma solution, en utilisant
du --threshold=
pour le cas d'utilisation d'OP:L'avantage de cela, c'est que vous
du
pouvez accepter un argument pour cette option dans un format connu - soit humain comme dans10K
,10MiB
ou avec quoi vous vous sentez à l'aise - vous n'avez pas besoin de convertir manuellement entre les formats / unités car celadu
gère cela.Pour référence, voici l'explication de cet
SIZE
argument à partir de la page de manuel:la source
du
qui ne le prennent pas en charge. L'--threshold
option a été ajoutée dans coreutils 8.21, sorti en 2013 .D'accord, si vous êtes sur un Mac, faites ceci:
stat -f %z "/Users/Example/config.log"
c'est tout!la source