Pregunta

En Linux, yo uso stat --format="%s" FILE, pero Solaris tengo acceso a no tiene comando stat.¿Qué debo usar?

Estoy escribiendo scripts de Bash, y realmente no puede instalar cualquier software nuevo en el sistema.

He considerado ya el uso de:

perl -e '@x=stat(shift);print $x[7]' FILE

o incluso:

ls -nl FILE | awk '{print $5}'

Pero ninguno de estos parece sensato - ejecutar Perl sólo para obtener el tamaño del archivo?O correr 2 comandos para hacer lo mismo?

¿Fue útil?

Solución

wc -c < filename (abreviatura de conteo de palabras, -c imprime el conteo de bytes) es un portátil, solución POSIX . Solo el formato de salida puede no ser uniforme en todas las plataformas, ya que algunos espacios pueden estar antepuestos (como es el caso de Solaris).

No omita la redirección de entrada. Cuando el archivo se pasa como argumento, el nombre del archivo se imprime después del recuento de bytes.

Me preocupaba que no funcionara para archivos binarios, pero funciona bien tanto en Linux como en Solaris. Puedes probarlo con wc -c < /usr/bin/wc. Además, las utilidades POSIX están garantizado para manejar archivos binarios , a menos que se especifique lo contrario explícitamente.

Otros consejos

Terminé escribiendo mi propio programa (realmente pequeño) para mostrar solo el tamaño. Más información aquí: http: // fwhacking .blogspot.com / 2011/03 / bfsize-print-file-size-in-bytes-and.html

Las dos formas más limpias en mi opinión con las herramientas comunes de Linux son:

$ stat -c %s /usr/bin/stat
50000

$ wc -c < /usr/bin/wc
36912

Pero simplemente no quiero escribir parámetros o canalizar la salida solo para obtener un tamaño de archivo, así que estoy usando mi propio bfsize.

Aunque du generalmente imprime el uso del disco y no el tamaño de datos real, GNU coreutils <=> puede imprimir el archivo " tamaño aparente " en bytes:

du -b FILE

Pero no funcionará en BSD, Solaris, macOS, ...

Finalmente, me decidí a usar ls, y bash matriz de expansión:

TEMP=( $( ls -ln FILE ) )
SIZE=${TEMP[4]}

no es muy agradable, pero al menos lo hace sólo 1 tenedor+execve, y no depende de secundaria (lenguaje de programación perl/ruby/python/lo que sea)

La solución más rápida multiplataforma (solo utiliza una bifurcación () para ls , no intenta contar caracteres reales, no genera awk, perl, etc. innecesarios).

Probado en MacOS, Linux: puede requerir modificaciones menores para Solaris:

__ln=( $( ls -Lon "$1" ) )
__size=${__ln[3]}
echo "Size is: $__size bytes"

Si es necesario, simplifique los argumentos ls y ajuste el desplazamiento en $ {__ ln [3]}.

Nota: seguirá los enlaces simbólicos.

Los BSD tienen stat con diferentes opciones del núcleo de GNU, pero capacidades similares.

stat -f %z <file name> 

Esto funciona en macOS (probado en 10.12), FreeBSD , NetBSD y OpenBSD .

Si usa find desde archivos GNU:

size=$( find . -maxdepth 1 -type f -name filename -printf '%s' )

Desafortunadamente, otras implementaciones de -maxdepth generalmente no son compatibles con -printf ni <=>. Este es el caso, p. Solaris y macOS <=>.

Al procesar la salida ls -n, como alternativa a las matrices de shell no portátiles, puede usar los argumentos posicionales, que forman la única matriz y son las únicas variables locales en la shell estándar. Envuelva la sobrescritura de argumentos posicionales en una función para preservar los argumentos originales en su script o función.

getsize() { set -- $(ls -dn "$1") && echo $5; }
getsize FILE

Esto divide la salida de ln -dn de acuerdo con la configuración actual de la variable de entorno IFS, la asigna a argumentos posicionales y repite la quinta. El -d asegura que los directorios se manejen correctamente y el -n asegura que los nombres de usuarios y grupos no necesitan ser resueltos, a diferencia de -l. Además, los nombres de usuarios y grupos que contienen espacios en blanco podrían, en teoría, romper la estructura de línea esperada; generalmente no se permiten, pero esta posibilidad aún hace que el programador se detenga y piense.

Puede usar el comando find para obtener un conjunto de archivos (aquí se extraen los archivos temporales). Luego puede usar el comando du para obtener el tamaño de archivo de cada archivo en forma legible por humanos usando el interruptor -h.

  

find $HOME -type f -name "*~" -exec du -h {} \;

SALIDA:

4.0K    /home/turing/Desktop/JavaExmp/TwoButtons.java~
4.0K    /home/turing/Desktop/JavaExmp/MyDrawPanel.java~
4.0K    /home/turing/Desktop/JavaExmp/Instream.java~
4.0K    /home/turing/Desktop/JavaExmp/RandomDemo.java~
4.0K    /home/turing/Desktop/JavaExmp/Buff.java~
4.0K    /home/turing/Desktop/JavaExmp/SimpleGui2.java~

Tu primer ejemplo de Perl no me parece irracional.

Es por razones como esta que migré de escribir scripts de shell (en bash / sh, etc.) a escribir todos menos los scripts más triviales en Perl. Descubrí que tenía que iniciar Perl para requisitos particulares, y a medida que lo hacía más y más, me di cuenta de que escribir los scripts en Perl probablemente era más poderoso (en términos del lenguaje y la amplia gama de bibliotecas disponibles a través de < a href = "http://www.cpan.org" rel = "nofollow noreferrer"> CPAN ) y una forma más eficiente de lograr lo que quería.

Tenga en cuenta que otros lenguajes de script de shell (por ejemplo, python / ruby) sin duda tendrán instalaciones similares, y es posible que desee evaluarlos para sus propósitos. Solo hablo de Perl, ya que ese es el lenguaje que uso y estoy familiarizado.

si tiene Perl en su Solaris, úselo. De lo contrario, ls with awk es su próxima mejor opción, ya que no tiene estadísticas o su hallazgo no es GNU find.

Hay un truco en Solaris que he usado, si pregunta por el tamaño de más de un archivo, devuelve solo el tamaño total sin nombres, así que incluya un archivo vacío como / dev / null como segundo archivo:

eg     archivo de comando / dev / null

No puedo recordar qué comando de tamaño funciona para ls / wc / etc; desafortunadamente no tengo un cuadro de Solaris para probarlo.

en Linux puede usar du -h $FILE, ¿eso también funciona en Solaris?

¿Intentaste du -ks | awk '{print $ 1 * 1024}'. Eso podría funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top