bash - que - ¿Cómo verificar el tamaño de un archivo?
ver tamaño de archivos ubuntu (12)
Basado en la respuesta de gniourf_gniourf,
find "file.txt" -size -90k
escribirá file.txt
en stdout si y solo si el tamaño de file.txt
es menor que 90K, y
find "file.txt" -size -90k -exec command /;
ejecutará el comando command
si file.txt
tiene un tamaño inferior a 90K. He probado esto en Linux. De find(1)
,
... Los siguientes argumentos de línea de comandos (las opciones
-H
,-L
y-P
) se consideran nombres de archivos o directorios que se examinarán, hasta el primer argumento que comienza con ''-'', ...
(énfasis añadido).
Tengo un script que comprueba el tamaño 0, pero creo que debe haber una forma más fácil de verificar el tamaño de los archivos. Es decir file.txt
es normalmente 100k; cómo hacer que un script compruebe si es inferior a 90k (incluido 0), y hacer que realice 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. " [email protected] < /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
En bash
if [ -s file.txt ]; then
...
fi
también funcionaría
Esto funciona tanto en Linux como en Macos
function filesize
{
local file=$1
size=`stat -c%s $file 2>/dev/null` # linux
if [ $? -eq 0 ]
then
echo $size
return 0
fi
eval $(stat -s $file) # macos
if [ $? -eq 0 ]
then
echo $st_size
return 0
fi
return -1
}
Me sorprende que nadie mencionó la stat
para 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 quieres. Y si desea encontrar archivos de un tamaño, entonces find
es definitivamente el camino a seguir.
También me gusta mucho para obtener el tamaño del archivo en kb, pero, para los bytes, usaría stat
:
size=$(stat -f%z $filename) # BSD stat
size=$(stat -c%s $filename) # GNU stat?
Para obtener el tamaño de archivo tanto en Linux como en Mac OS X (y presumiblemente otros BSD), no hay muchas opciones, y la mayoría de las que se sugieren aquí solo funcionarán en un sistema.
Dado f=/path/to/your/file
,
que funciona tanto en Linux como en Mac Bash:
size=$( perl -e ''print -s shift'' "$f" )
o
size=$( wc -c "$f" | awk ''{print $1}'' )
Las otras respuestas funcionan bien en Linux, pero no en Mac:
du
no tiene una opción-b
en Mac, y el truco BLOCKSIZE = 1 no funciona ("tamaño mínimo de bloques es 512", lo que conduce a un resultado incorrecto)cut -d'' '' -f1
no funciona porque en Mac, el número puede alinearse a la derecha, rellenado con espacios al frente.
Por lo tanto, si necesita algo flexible, es el operador de perl
-s
o wc -c
conectado a awk ''{print $1}''
(awk ignorará el espacio en blanco inicial).
Y, por supuesto, con respecto al resto de su pregunta original, use el operador -lt
(o -gt
):
if [ $size -lt $your_wanted_size ]; then
if [ $size -lt $your_wanted_size ]; then
etc.
Si está buscando solo el tamaño de un archivo:
$ cat $file | wc -c
> 203233
Si su find
maneja esta sintaxis, puede usarla:
find -maxdepth 1 -name "file.txt" -size -90k
Esto generará file.txt
para stdout si y solo si el tamaño de file.txt
es inferior a 90k. Para ejecutar un script script
si file.txt
tiene un tamaño inferior a 90k:
find -maxdepth 1 -name "file.txt" -size -90k -exec script /;
solución alternativa con awk y doble paréntesis:
FILENAME=file.txt
SIZE=$(du -sb $FILENAME | awk ''{ print $1 }'')
if ((SIZE<90000)) ; then
echo "less";
else
echo "not less";
fi
[ -n file.txt ]
no verifica su tamaño, comprueba que la cadena file.txt
tenga una longitud distinta de 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:
file=file.txt
minimumsize=90000
actualsize=$(wc -c <"$file")
if [ $actualsize -ge $minimumsize ]; then
echo size is over $minimumsize bytes
else
echo size is under $minimumsize bytes
fi
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, podría usar du -k
para obtener el tamaño (espacio de disco utilizado) en kilobytes:
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 necesita más control sobre el formato de salida, también puede mirar stat
. En Linux, comenzarías con algo como stat -c ''%s'' file.txt
, y en BSD / Mac OS X, algo así como stat -f ''%z'' file.txt
.
stat parece hacer esto con la menor cantidad de llamadas al sistema:
$ set debian-live-8.2.0-amd64-xfce-desktop.iso
$ strace stat --format %s $1 | wc
282 2795 27364
$ strace wc --bytes $1 | wc
307 3063 29091
$ strace du --bytes $1 | wc
437 4376 41955
$ strace find $1 -printf %s | wc
604 6061 64793
ls -l $file | awk ''{print $6}''
asumiendo que el comando ls informa sobre el tamaño del archivo en la columna # 6
python -c ''import os; print (os.path.getsize("... filename ..."))''
portátil, todos los sabores de pitón, evita la variación en dialectos de estadísticas