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.txtnormalmente 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.txtno 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 -cpara 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 -kpara 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 1lugar destat -c '%s' "$file"? Ostat --printf="%s" "$file"?stattienen diferentes banderas.... | cut -d' ' -f1para 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). ElBLOCKSIZEvalor mínimo paraduen OSX es512.wc -c <filenametambién usafstatyseek? Tenga en cuenta quefstattoma un fd, no un nombre de ruta.Me sorprende que nadie mencione
statverificar el tamaño del archivo. Algunos métodos son definitivamente mejores: usar-spara 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, entoncesfindsin duda es el camino a seguir.También me gusta
dumucho obtener el tamaño del archivo en kb, pero, para bytes, usaríastat:fuente
states una gran idea, pero en CentOS esto es lo que funcionó para mí:size=$(stat -c%s $filename)statlo 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
duno 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)))$awkusandoread(bashcomando interno):read SIZE _ <<<$(du -sb "$FILENAME")Si
findmaneja esta sintaxis, puede usarla:Esto dará salida
file.txta stdout si y solo si el tamañofile.txtes menor a 90k. Para ejecutar un scriptscriptsifile.txttiene un tamaño inferior a 90k:fuente
find . -maxdepth 1 -name "file.txt" -size -90kSi 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 | wcSi 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 parawcy 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:
duno tiene una-bopció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' ' -f1no 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-soperador owc -cverter 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 ]; thenetc.fuente
size=$(wc -c < "$f")(tenga en cuenta<que, lo que hacewcque 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.txten stdout si y solo si el tamañofile.txtes menor a 90K, yejecutará el comando
commandsifile.txttiene 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--thresholdpara esto. No estoy seguro de si esta opción está disponible en todas las versiones dedupero 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
dupuede aceptar un argumento para esa opción en un formato conocido - ya sea humana como en10K,10MiBo lo que cada vez que se sienta cómodo - no es necesario para convertir manualmente entre formatos / unidades desdedulas manijas eso.Como referencia, aquí está la explicación de este
SIZEargumento en la página del manual:fuente
duque no lo admiten. La--thresholdopció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