2011-05-07 25 views
110

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.¿Cómo verificar el tamaño de un archivo?

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 
+1

http://unix.stackexchange.com/q uestions/16640/how-can-i-get-the-size-of-a-file-in-a-bash-script –

Respuesta

193

[ -n file.txt ] no comprueba su tamaño, se comprueba que la cadena file.txt no es cero longitud, por lo que siempre tendrá éxito.

Si quiere decir "el tamaño no es cero", necesita [ -s file.txt ].

conseguir tamaño de un archivo, puede utilizar 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 quiere.

Pero para tu información, si desea saber cuánto espacio de disco el archivo está utilizando, se puede utilizar du -k para obtener el (espacio en disco utilizado) el tamaño 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ía con algo como stat -c '%s' file.txt, y en BSD/Mac OS X, algo así como stat -f '%z' file.txt.

+3

Por qué 'du -b" $ file "| cortar -f 1' en lugar de 'stat -c '% s'" $ file "'? O 'stat --printf ="% s "" $ file "'? – mivk

+1

Solo porque es más portátil. BSD y Linux 'stat' tienen banderas diferentes. – Mikel

+0

Una ventaja de la solución 'du' es que puede (con la opción -s) también usarse en directorios. –

14

solución alternativa con awk y el doble paréntesis:

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

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

Bueno, pero no funcionará en OSX, donde 'du' no admite' -b'. (Puede ser una elección de estilo consciente, pero solo para mencionar la alternativa: puede omitir el prefijo '$' dentro de '((...))' al hacer referencia a variables: '((SIZE <90000))') – mklement0

+0

En realidad era una edición de un usuario anterior que pensó que era incorrecto omitir '$' – fstab

+1

@fstab, puede omitir 'awk' usando' leer' (comando interno 'bash'):' leer TAMAÑO _ <<< $ (du -sb "$ FILENAME") ' – Jdamian

-2

En bash

if [ -s file.txt ]; then 
... 
fi 

funcionaría también.

+8

Esto no funcionará, porque el OP quiere saber si el tamaño es <90k. Esto solo verifica que el tamaño sea> 0. –

10

Si su find maneja esta sintaxis, se puede usar:

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

Esta es la salida a la salida estándar file.txt si y sólo si el tamaño de file.txt es inferior a 90k. Para ejecutar un script script si file.txt tiene un tamaño de menos de 90k:

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

+1, pero para que también funcione en OSX, necesita un argumento de directorio de destino explícito, por ejemplo, 'find. -maxdepth 1 -name "file.txt" -size -90k' – mklement0

4

Para conseguir el tamaño del archivo en Linux y Mac OS X (y presumiblemente otros BSD), no hay muchas opciones, y la mayor parte del los sugeridos aquí solo funcionarán en un sistema.

Dada f=/path/to/your/file,

lo que funciona tanto en Linux y Mac 's 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 de -b en Mac, y el truco BLOCKSIZE = 1 no funciona ("tamaño de bloque mínimo es de 512", lo que conduce a un resultado erróneo)

  • cut -d' ' -f1 no funciona porque en Mac, el número puede alinearse a la derecha, rellenado con espacios al frente.

Así que si usted necesita algo flexibles, que es ya sea -s operador perl 's, o wc -c hilo a awk '{print $1}' (awk pasará por alto el espacio en blanco al principio).

Y, por supuesto, en relación con el resto de su pregunta original, utilice el -lt (o -gt) operador:

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

+3

+1; si sabes que solo usarás el tamaño en un contexto _arithmetic_ (donde se ignora el espacio en blanco inicial), puedes simplificarlo a 'size = $ (wc -c <" $ f ")' (nota el '<', que hace que 'wc' solo reporte un número). En comparación: no olvides más "bash-ful" 'if ((size mklement0

15

Me sorprende que nadie mencionó stat para comprobar 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 quiere. Y si quiere encontrar archivos de un tamaño, entonces find es sin duda el camino a seguir.

También me gusta du mucho para conseguir el tamaño del archivo en kb, pero, por bytes, que haría uso de stat:

size=$(stat -f%z $filename) # BSD stat 

size=$(stat -c%s $filename) # GNU stat? 
+2

'stat' es una gran idea, pero en CentOS esto es lo que funcionó para mí:' size = $ (stat -c% s $ filename) ' –

+0

La diferencia entre GNU y BSD es lo que, lamentablemente, hace que esta alternativa sea un poco menos atractivo. :( – lapo

8

Si están buscando sólo el tamaño de un archivo:

$ cat $file | wc -c 
> 203233 
+1

Esta podría ser la respuesta viable más corta, pero probablemente también sea la más lenta :) :) – SunSparc

+2

Sí, pero sin duda económicamente superior: costo del tiempo de ingeniería> Costo del tiempo de cálculo – BananaNeil

+1

Por supuesto. Solo depende de tus necesidades – SunSparc

6

Esto funciona tanto en Linux y 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 
} 
1

sobre la base de la respuesta de gniourf_gniourf,

find "file.txt" -size -90k 

va a escribir en la salida estándar file.txt si y sólo si el tamaño de file.txt es menos de 90K, y

find "file.txt" -size -90k -exec command \;

ejecutará el comando command si file.txt tiene un tamaño de menos de 90K. He probado esto en Linux. De find(1),

... argumentos de línea de comandos siguientes (los -H, -L y -P opciones) se toman como nombres de archivos o directorios a ser examinado, hasta el primer argumento que comienza con '-', ...

(énfasis añadido).

3

stat parece hacer esto con las llamadas al sistema menor cantidad:

$ 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 
3
python -c 'import os; print (os.path.getsize("... filename ..."))' 

portátil, todos los sabores de pitón, evita la variación en los dialectos de estadísticas

0
ls -l $file | awk '{print $6}' 

el supuesto de que el comando ls informa el tamaño del archivo en la columna # 6

Cuestiones relacionadas