Tengo un script que verifica el tamaño 0, pero pensé que debe haber una forma más fácil de verificar el tamaño de los archivos. Es decir, file.txt
normalmente es 100k; cómo hacer que un script verifique si es inferior a 90k (incluido 0), y que haga una nueva copia porque el archivo está dañado en este caso.
Lo que estoy usando actualmente ...
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
Respuestas:
[ -n file.txt ]
no verifica su tamaño, verifica que la cadenafile.txt
no sea de longitud cero, por lo que siempre tendrá éxito.Si quiere decir "el tamaño no es cero", necesita
[ -s file.txt ]
.Para obtener el tamaño de un archivo, puede usar
wc -c
para obtener el tamaño (longitud del archivo) en bytes:En este caso, parece que eso es lo que quieres.
Pero para su información, si desea saber cuánto espacio de disco está usando el archivo, puede usar
du -k
para obtener el tamaño (espacio de disco usado) en kilobytes:Si necesita más control sobre el formato de salida, también puede mirar
stat
. En Linux, comenzaría con algo comostat -c '%s' file.txt
, y en BSD / Mac OS X, algo asístat -f '%z' file.txt
.fuente
du -b "$file" | cut -f 1
lugar destat -c '%s' "$file"
? Ostat --printf="%s" "$file"
?stat
tienen diferentes banderas.... | cut -d' ' -f1
para que funcione en Ubuntu.wc -c < "$file"
(tenga en cuenta la<
), en cuyo caso no necesita la| cut ...
parte (que, según lo publicado, no funciona en OSX). ElBLOCKSIZE
valor mínimo paradu
en OSX es512
.wc -c <filename
también usafstat
yseek
? Tenga en cuenta quefstat
toma un fd, no un nombre de ruta.Me sorprende que nadie mencione
stat
verificar el tamaño del archivo. Algunos métodos son definitivamente mejores: usar-s
para averiguar si el archivo está vacío o no es más fácil que cualquier otra cosa, si eso es todo lo que desea. Y si desea encontrar archivos de un tamaño, entoncesfind
sin duda es el camino a seguir.También me gusta
du
mucho obtener el tamaño del archivo en kb, pero, para bytes, usaríastat
:fuente
stat
es una gran idea, pero en CentOS esto es lo que funcionó para mí:size=$(stat -c%s $filename)
stat
lo correcto en algunas situaciones, y los archivos dispersos no son relevantes en la mayoría de las situaciones, aunque ciertamente no en todos.Solución alternativa con awk y paréntesis doble:
fuente
du
no es compatible-b
. (Puede ser una elección de estilo consciente, pero sólo por mencionar la alternativa: se puede omitir el$
interior prefijo(( ... ))
al hacer referencia a las variables:((SIZE<90000))
)$
awk
usandoread
(bash
comando interno):read SIZE _ <<<$(du -sb "$FILENAME")
Si
find
maneja esta sintaxis, puede usarla:Esto dará salida
file.txt
a stdout si y solo si el tamañofile.txt
es menor a 90k. Para ejecutar un scriptscript
sifile.txt
tiene un tamaño inferior a 90k:fuente
find . -maxdepth 1 -name "file.txt" -size -90k
Si está buscando solo el tamaño de un archivo:
fuente
wc -c "$file"
fue dada como respuesta en 2011 (hace tres años). Sí,wc -c "$file"
tiene el problema de que genera el nombre del archivo y el recuento de caracteres, por lo que las primeras respuestas agregaron un comando para separar el recuento. Perowc -c < "$file"
, que soluciona ese problema, se agregó como un comentario en mayo de 2014. Su respuesta es equivalente a eso, excepto que agrega un "uso inútil decat
" . Además, debe citar todas las referencias de variables de shell a menos que tenga una buena razón para no hacerlo.Esto funciona tanto en Linux como en Macos
fuente
stat parece hacer esto con la menor cantidad de llamadas al sistema:
fuente
strace du --bytes $1 2>&1 >/dev/null | wc
Si ese es el caso, entonces en la arquitectura amd64 en ArchLinux (generalmente las últimas versiones de todo) tengo 45 líneas paradu
, 46 líneas parastat
, 47 líneas parawc
y 72 líneas parafind
.portátil, todos los sabores de python, evita la variación en dialectos de estadísticas
fuente
Para obtener el tamaño de archivo en Linux y Mac OS X (y presumiblemente en otros BSD), no hay muchas opciones, y la mayoría de las sugeridas aquí solo funcionarán en un sistema.
Teniendo en cuenta
f=/path/to/your/file
,¿Qué funciona en Linux y Mac 's Bash?
o
Las otras respuestas funcionan bien en Linux, pero no en Mac:
du
no tiene una-b
opción en Mac, y el truco BLOCKSIZE = 1 no funciona ("el tamaño mínimo de bloque es 512", lo que conduce a un resultado incorrecto)cut -d' ' -f1
no funciona porque en Mac, el número puede estar alineado a la derecha, rellenado con espacios al frente.Así que si usted necesita algo flexibles, o es
perl
's-s
operador owc -c
verter alawk '{print $1}'
(awk ignorará el espacio en blanco al principio).Y, por supuesto, con respecto al resto de su pregunta original, use el operador
-lt
(o-gt
):if [ $size -lt $your_wanted_size ]; then
etc.fuente
size=$(wc -c < "$f")
(tenga en cuenta<
que, lo que hacewc
que solo se informe un número). Re comparación: no olvides los más "bash-ful"if (( size < your_wanted_size )); then ...
(y también[[ $size -lt $your_wanted_size ]]
).Según la respuesta de gniourf_gniourf,
escribirá
file.txt
en stdout si y solo si el tamañofile.txt
es menor a 90K, yejecutará el comando
command
sifile.txt
tiene un tamaño inferior a 90K. He probado esto en Linux. Defind(1)
,(énfasis añadido).
fuente
asumiendo que el comando ls informa el tamaño del archivo en la columna # 6
fuente
Me gustaría utilizar
du
's--threshold
para esto. No estoy seguro de si esta opción está disponible en todas las versiones dedu
pero está implementada en la versión de GNU.Citando del manual de du (1) :
Aquí está mi solución, usando
du --threshold=
para el caso de uso de OP:La ventaja de esto, es que
du
puede aceptar un argumento para esa opción en un formato conocido - ya sea humana como en10K
,10MiB
o lo que cada vez que se sienta cómodo - no es necesario para convertir manualmente entre formatos / unidades desdedu
las manijas eso.Como referencia, aquí está la explicación de este
SIZE
argumento en la página del manual:fuente
du
que no lo admiten. La--threshold
opción se agregó en coreutils 8.21, lanzado en 2013 .Bien, si estás en una Mac, haz esto: ¡
stat -f %z "/Users/Example/config.log"
Eso es!fuente