
Quiero comprobar si el tamaño del archivo más reciente es superior a 2 MB:
test $(ls -st | head -n2 | tail -n1 | awk '{print $1}') -gt 2097152 && echo "true"
¿Existe una forma más eficiente o elegante de hacer esto?
Intenté canalizar aún más la salida de awk a
| test {} -gt 2097152
pero consigue
bash: prueba: {}: expresión entera esperada
Entonces
| test {}>"2097152"
produce siempre "verdadero", así que se me ocurrió la construcción
test $(...) -gt 2097152
Respuesta1
Puede que haya mejores formas que ls
obtener el archivo más nuevo, pero la mayor parte de lo que haces se puede hacer simplemente en awk:
ls -st | awk 'NR == 2 && $1 > 2097152 {print "true"}'
NR == 2
- en la segunda línea$1 > 2097152
- cuando la primera columna es mayor que 2097152
Respuesta2
Con zsh
:
set -- *(.om[1]) *(N.L+2097152om[1])
if [[ $1 = $2 ]]; then
printf '%s\n' "The apparent size of the newest non-hidden regular file in the current" \
"directory ($1) is strictly greater than 2MiB."
fi
Si desea incluir directorios ocultos, agréguelos D
a ambos calificadores globales. Si desea considerar archivos no regulares (directorios, enlaces simbólicos, dispositivos...), elimine.
La idea es expandir ambos globos:
.
la lista de archivos regulares ( ) no ocultos ,o
ordenados porm
tiempo de modificación, limitado a uno ([1]
).- lo mismo pero limitado a archivos cuya
L
longitud sea estrictamente mayor (+
) que2097152
(pero habilitandoN
ullGlob para que no sea un error fatal si no hay coincidencia).
Y nuestra condición es si ambos globos se expanden al mismo archivo.
Tenga en cuenta que ls -s
no informa el tamaño de los archivos, sino su uso del disco (en número de unidades de 512 bytes, KiB u otro según la ls
implementación y/o el entorno). ls
informa el tamaño del archivo en éllargoformato de salida ( ls -l
o ls -n
(o -o
/ -g
con algunas implementaciones)).
Otra opción es usar zsh
el archivo stat
incorporado para obtener el tamaño (o el uso del disco) del archivo más reciente:
zmodload zsh/stat
if
stat -LH s -- *(.om[1]) &&
((s[size] > 2097152))
then
printf '%s\n' "The apparent size of the newest non-hidden regular file in the current" \
"directory ($1) is strictly greater than 2MiB."
fi
O:
zmodload zsh/stat
if
stat -LH s -- *(.om[1]) &&
((s[blocks] > 2097152))
then
printf '%s\n' "The newest non-hidden regular file in the current directory" \
"($1) uses more than 2097152 512-byte units of disk space."
fi
(en otras palabras, su uso de disco es superior a 1GiB)