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
- las cosas antes del texto ''personal''
- el tamaño del archivo
- 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 "test*" -exec du -sh {} /; 4.0K ./test1 0 ./test2 0 ./test3 0 ./test4 $
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;)