it-swarm-es.tech

¿Cómo obtengo el comando de búsqueda para imprimir el tamaño del archivo con el nombre del archivo?

Si emito el comando de búsqueda de la siguiente manera:

$ find . -name *.ear

Se imprime:

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

Lo que quiero 'imprimir' en la línea de comando 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
84
Brian
find . -name '*.ear' -exec ls -lh {} \;

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

90
shyam

Necesitas usar -exec o -printf. Printf funciona así:

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

-exec es más poderoso y le permite ejecutar comandos arbitrarios, por lo que podría usar una versión de 'ls' o 'wc' para imprimir el nombre del archivo junto con otra información. 'man find' le mostrará los argumentos disponibles para printf, que pueden hacer mucho más que solo archivos.

[edit] -printf no está en el estándar POSIX oficial, así que verifica si es compatible con tu versión. Sin embargo, la mayoría de los sistemas modernos utilizarán GNU o una versión similar, así que es muy probable que se implemente.

92
Leigh Caldwell

una solución simple es usar la opción -ls en find:

find . -name \*.ear -ls

Eso le da cada entrada en el formato normal "ls -l". O, para obtener la salida específica que parece estar buscando, esto:

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

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

21
Michael Cramer

Usando gnu find, creo que esto es lo que quieres. Encuentra todos los archivos reales y no directorios (-tipo f), y para cada uno imprime el nombre del archivo (% p), una pestaña (\ t), el tamaño en kilobytes (% k), el sufijo "KB" y luego una nueva linea (\ n).

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

Si el comando printf no formatea las cosas de la forma que desea, puede usar exec, seguido del comando que desea ejecutar en cada archivo. Use {} para el nombre de archivo y termine el comando con un punto y coma (;). En la mayoría de los shells, los tres de esos personajes deberían escaparse con una barra invertida.

Aquí hay una solución simple que los encuentra e imprime usando "ls -lh", que le mostrará el tamaño en forma legible para el ser humano (k para kilobytes, M para megabytes):

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

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

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

Esto le da solo el tamaño del archivo, en lugar de todas las cosas innecesarias.

7
user2121791

¿Por qué no usar du -a ? P.ej.

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

Funciona en una Mac

4
Andreas

Awk puede arreglar la salida para dar justo lo que pidió el interrogador. En mi sistema Solaris 10, busque -ls imprime el tamaño en KB como segundo campo, así que:

% 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, use -exec ls -lh y seleccione 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
4
tpgould

Luché con esto en Mac OS X, donde el comando de búsqueda no es compatible con -printf.

Una solución que encontré, que ciertamente se basa en el 'grupo' de todos los archivos que son 'personal' fue ...

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

Esto divide la salida de ls en tres tokens.

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

Y luego genera los tokens 2 y 3, es decir, la salida es el número de bytes y luego el nombre del archivo

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

Esto debería proporcionarle lo que está buscando, formato incluido (es decir, nombre de archivo primero y tamaño posterior):

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

salida de muestra (donde usé -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
2
adriano72
 $ encontrar. -nombre "prueba *" -exec du -sh {} \; 
 4.0K ./test1[.____.◆0 ./test2[.____.◆0 ./test3[.____.◆ /test4[.____. adjudicacedentimiendo.____.]

Referencia de Scripter World

1
scripter

Podrías probar 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 para KB y -m para MB. Te dará una salida como

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear
1
Yaba
find . -name "*.ear" | xargs ls -sh
1
killdash10

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 < {})"' ';'
1
kenorb
find . -name "*.ear" -exec ls -l {} \;
0
Jeremy Weathers