¿Cómo puedo obtener el comando buscar imprimir el tamaño del archivo con el nombre del archivo?

StackOverflow https://stackoverflow.com/questions/64649

Pregunta

Si emitir el comando buscar de la siguiente manera:

$ find . -name *.ear

Imprime:

./dir1/dir2/earFile1.ear
./dir1/dir2/earFile2.ear
./dir1/dir3/earFile1.ear

Lo que quiero 'print' a la línea de comandos es el nombre y el tamaño:

./dir1/dir2/earFile1.ear  5000 KB
./dir1/dir2/earFile2.ear  5400 KB
./dir1/dir3/earFile1.ear  5400 KB
¿Fue útil?

Solución

find . -name '*.ear' -exec ls -lh {} \;

sólo el h extra de jer.drab.org's respuesta.ahorra tiempo convirtiendo a MB mentalmente ;)

Otros consejos

Usted necesidad de utilizar -exec o -printf.Printf trabaja como esto:

find . -name *.ear -printf "%p %k KB\n"

-exec es más potente y te permite ejecutar comandos arbitrarios - así que usted podría utilizar una versión de 'ls' o 'wc' para imprimir el nombre del archivo junto con otra información.'el hombre se encuentra' le mostrará los argumentos disponibles a printf, que puede hacer mucho más que sólo de tamaño de archivo.

[editar] -printf no está en el oficial estándar POSIX, a fin de comprobar si es compatible con su versión.Sin embargo, la mayoría de los modernos sistemas GNU encontrar o una versión extendida del mismo modo, así que hay una buena probabilidad de que va a ser implementado.

una solución simple es usar el comando ls opción de encontrar:

find . -name \*.ear -ls

Que le da cada entrada en la normal "ls -l" formato.O, para obtener la salida específica que parecen estar buscando, este:

find . -name \*.ear -printf "%p\t%k KB\n"

Que le dará el nombre del archivo seguido por el tamaño en KB.

El uso de gnu encontrar, creo que esto es lo que usted desea.Encuentra todos los archivos reales y no a directorios (tipo f), y para cada uno imprime el nombre del archivo (%p), un tabulador ( ), el tamaño en kilobytes (%k), el sufijo "KB", y luego un salto de línea ( ).

find . -type f -printf '%p\t%k KB\n'

Si el comando printf no el formato de las cosas de la manera que usted desea, usted puede usar exec, seguido por el comando que se desea ejecutar en cada archivo.El uso de {} el nombre de archivo, y terminar el mandato con un punto y coma (;).En la mayoría de las consolas, todos los tres de los personajes deben ser precedidos de una barra diagonal inversa.

He aquí una sencilla solución que encuentra y grabados con "ls -lh", que mostrará el tamaño en forma legible (k para kilobytes), M para megabytes):

find . -type f -exec ls -lh \{\} \;

Como otra alternativa, "wc-c" se imprimirá el número de caracteres (bytes) en el archivo:

find . -type f -exec wc -c \{\} \;
find . -name '*.ear' -exec du -h {} \;

Esto le da a usted el tamaño de archivo solamente, en lugar de todo el material innecesario.

Awk puede arreglar la salida para dar sólo lo que el interrogador le pide.En mi Solaris 10 sistema, encontrar -ls impresiones de tamaño en KB como el segundo campo, así:

% find . -name '*.ear' -ls | awk '{print $2, $11}'
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir2/earFile3.ear
5400 ./dir1/dir2/earFile1.ear

De lo contrario, utilice la opción-exec ls -lh y elegir el campo de tamaño de la salida.De nuevo en Solaris 10:

% find . -name '*.ear' -exec ls -lh {} \; | awk '{print $5, $9}'
5.3M ./dir1/dir2/earFile2.ear
5.3M ./dir1/dir2/earFile3.ear
5.3M ./dir1/dir2/earFile1.ear

¿Por qué no usar du -un ?E. g.

find . -name "*.ear" -exec du -a {} \;

Funciona en un Mac

He luchado con esto en Mac OS X, donde el comando buscar no apoyo -printf.

Una solución que he encontrado, que es cierto que se basa en el "grupo" para todos los archivos 'personal' fue...

ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'

Este se divide el ls de largo la salida en las tres fichas

  1. las cosas antes de que el texto 'personal'
  2. el tamaño del archivo
  3. el nombre de archivo

Y, a continuación, salidas de fichas 2 y 3, es decir,la salida es el número de bytes nombre de archivo y, a continuación,

8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php

Esto debería obtener lo que usted está buscando, formato incluido (es decir,nombre de archivo primero y tamaño después):

find . -type f -iname "*.ear" -exec du -ah {} \; | awk '{print $2"\t", $1}'

ejemplo de salida (donde solía -iname "*.php" para obtener algún resultado):

./plugins/bat/class.bat.inc.php  20K
./plugins/quotas/class.quotas.inc.php    8.0K
./plugins/dmraid/class.dmraid.inc.php    8.0K
./plugins/updatenotifier/class.updatenotifier.inc.php    4.0K
./index.php      4.0K
./config.php     12K
./includes/mb/class.hwsensors.inc.php    8.0K

Usted podría intentar esto:

find. -name *.ear -exec du {} \;

Esto le dará el tamaño en bytes.Pero el comando du también acepta los parámetros -k KB y -m para MB.Se le dará una salida como

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear
find . -name "*.ear" | xargs ls -sh
$ find . -name "test*" -exec du -sh {} \;
4.0K    ./test1
0       ./test2
0       ./test3
0       ./test4
$

Scripter de referencia en el Mundo

Pruebe los siguientes comandos:

GNU stat:

find . -type f -name *.ear -exec stat -c "%n %s" {} ';'

BSD stat:

find . -type f -name *.ear -exec stat -f "%N %z" {} ';'

sin embargo stat no es estándar, por lo que du o wc podría ser un mejor enfoque:

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'
find . -name "*.ear" -exec ls -l {} \;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top