2008-09-15 29 views

Respuesta

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

just the h extra from jer.drab.org's reply. ahorra tiempo convirtiendo a MB mentalmente;)

+6

Esta versión ejecutará el proceso "ls" para cada archivo. Si tiene muchos archivos (por ejemplo, más de mil), mejor optimice eso ya sea: 'encontrar. -name '* .ear' -exec ls -lh {} + \; '(extensión GNU) o ' encontrar. -name '* .ear' -print0 | xargs -0 ls -lh'. También puede agregar '-type f' si solo está interesado en los archivos (o agregue' -d' a ls si desea que los directorios se incluyan sin sus contenidos). – ash108

+1

Su respuesta no excluye directorios, por lo que también terminará ejecutando ls en directorios, lo que claramente no es lo correcto. –

+1

Esta es una forma realmente ineficiente de hacer las cosas, y desafortunadamente los comentarios de ash108 tampoco son ideales. Es mucho mejor usar la opción -printf para encontrar. – oskarpearson

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

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 para 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 
17

una solución simple es utilizar la opción -ls en hallazgo:

find . -name \*.ear -ls 

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

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

¿Qué le dará el nombre de archivo seguido por el tamaño en KB.

74

Debe 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 utilizar 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 verifique si es compatible con su 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.

+0

Parece que tu ejemplo es más preciso, pero me parece que no puede conseguir el ejemplo de trabajo en Solaris 10. –

+0

Me temo que Solaris find no admite -printf en absoluto: http://jrwren.wrenfam.com/blog/2006/10/07/solaris-find-sucks/ http: //www.cs.bgu.ac.il/~arik/usail/man/solaris/find.1.html Puede instalar GNU find si le molestan, de lo contrario debe usar exec o | según lo sugerido por otros. –

+1

+1 Esto parece más limpio. Para formatear el resultado, preferiría agregar el comando 'column'. 'encontrar. -name * .ear -printf "% p% k KB \ n" | column -t' – Amol

13

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 forma que desee, puede utilizar exec, seguido por el 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 encuentra y las imprime usando "ls -lh", que le mostrará el tamaño en formato legible (k para kilobytes, M para megabytes):

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

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

find . -type f -exec wc -c \{\} \; 
+0

+1 Excepto por haber omitido '-name '* .ear'' en los ejemplos, esta debería ser la respuesta número 1. Responde la pregunta con precisión, explica el significado de la sintaxis y ofrece múltiples alternativas. – OsakaWebbie

+0

esto se debe aceptar ya que no ejecuta un nuevo comando para cada línea, por lo que es mucho más rápido que el actualmente aceptado de shyam – jirislav

3

Awk puede fijar encima de la salida para obtener justo lo que el interrogador pidió. En mi sistema Solaris 10, encontrar -ls tamaño de las impresiones en KB como el segundo campo, por lo 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, utilice ls -exec -lh y seleccionar 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 
3

tuve problemas con esto en Mac OS X, donde el comando find no soporta -printf.

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

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

Esto divide la salida de ls larga en tres fichas

  1. la materia antes del texto de tamaño
  2. el archivo 'personal'
  3. el nombre del archivo

Y luego da salida a señales 2 y 3, es decir, la salida es el número de bytes y luego nombre de archivo

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

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

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

trabaja en un Mac

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

Esto le da sólo el tamaño del archivo, en lugar de toda la materia innecesaria.

+0

'wc' funciona para esto simplemente mejor, si necesita el tamaño en bytes. – Alex

1

Esto debería darle lo que está buscando, formateo incluido (es decirNombre del archivo primero y tamaño después):

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

salida de ejemplo (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 
1

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" {} ';' 

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

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