texto recursivo por extension ejemplos consola comando buscar archivos archivo unix command-line find solaris

unix - recursivo - ¿Cómo obtengo el comando find para imprimir el tamaño del archivo con el nombre del archivo?



comando find linux ejemplos (14)

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

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

Funciona en una Mac

Si publico el comando find de la siguiente manera:

$ find . -name *.ear

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


Awk puede arreglar la salida para dar justo lo que pidió el interrogador. En mi sistema Solaris 10, encuentre -ls imprime el tamaño en KB como el 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. Nuevamente 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


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

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

muestra de salida (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


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

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

-exec es más potente 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, lo que puede hacer mucho más que solo el tamaño de archivo.

[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 usarán GNU find o una versión similar extendida, por lo que es muy probable que se implemente.


Pruebe los siguientes comandos:

stat GNU:

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

stat BSD:

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

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

find . -type f -name *.ear -exec sh -c ''echo "{} $(wc -c < {})"'' '';''


Puedes 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 para KB y -m para MB. Le dará un resultado como

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


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

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

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

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

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

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

find . -type f -exec wc -c /{/} /;


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

find . -name /*.ear -ls

Eso le proporciona cada entrada en el formato normal "ls -l". O bien, para obtener el resultado específico que pareces estar buscando, esto:

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

Lo cual le dará el nombre de archivo seguido del tamaño en KB.


-printf con esto en Mac OS X donde el comando find no admite -printf .

Una solución que encontré, que confía en que el ''grupo'' para todos los archivos es ''staff'' fue ...

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

Esto divide la salida larga 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 muestra 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



find . -name "*.ear" -exec ls -l {} /;


find . -name "*.ear" | xargs ls -sh


find . -name ''*.ear'' -exec du -h {} /;

Esto le proporciona solo el tamaño del archivo, en lugar de todo lo innecesario.


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

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