it-swarm.it

Come posso ottenere il comando find per stampare la dimensione del file con il nome del file?

Se eseguo il comando find come segue:

$ find . -name *.ear

Stampa:

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

Quello che voglio 'stampare' sulla riga di comando è il nome e la dimensione:

./dir1/dir2/earFile1.ear  5000 KB
./dir1/dir2/earFile2.ear  5400 KB
./dir1/dir3/earFile1.ear  5400 KB
85
Brian
find . -name '*.ear' -exec ls -lh {} \;

solo il h extra dalla risposta di jer.drab.org. consente di risparmiare tempo convertendo mentalmente in MB;)

92
shyam

Devi usare -exec o -printf. Printf funziona in questo modo:

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

-exec è più potente e consente di eseguire comandi arbitrari, quindi è possibile utilizzare una versione di 'ls' o 'wc' per stampare il nome del file insieme ad altre informazioni. 'man find' ti mostrerà gli argomenti disponibili per printf, il che può fare molto di più di una semplice dimensione di file.

[edit] -printf non è nello standard POSIX ufficiale, quindi controlla se è supportato nella tua versione. Tuttavia, la maggior parte dei sistemi moderni utilizzerà GNU o una versione estesa in modo simile, quindi c'è una buona probabilità che venga implementata.

94
Leigh Caldwell

una soluzione semplice è usare l'opzione -ls in find:

find . -name \*.ear -ls

Questo ti dà ogni voce nel normale formato "ls -l". Oppure, per ottenere l'output specifico che sembra stia cercando, questo:

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

Che ti darà il nome del file seguito dalla dimensione in KB.

21
Michael Cramer

Usando gnu find, penso che questo sia quello che vuoi. Trova tutti i file reali e non le directory (-type f), e per ognuno stampa il nome del file (% p), una scheda (\ t), la dimensione in kilobyte (% k), il suffisso "KB" e quindi una nuova riga (\ n).

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

Se il comando printf non formatta le cose nel modo desiderato, è possibile utilizzare exec, seguito dal comando che si desidera eseguire su ciascun file. Utilizzare {} per il nome file e terminare il comando con un punto e virgola (;). Sulla maggior parte delle conchiglie, tutti e tre questi personaggi dovrebbero essere sfuggiti a una barra rovesciata.

Ecco una semplice soluzione che li trova e li stampa usando "ls -lh", che ti mostrerà le dimensioni in forma leggibile dall'uomo (k per kilobyte, M per megabyte):

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

Come ulteriore alternativa, "wc -c" stamperà il numero di caratteri (byte) nel file:

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

Questo ti dà solo la dimensione del file, invece di tutte le cose inutili.

7
user2121791

Perché non usare du -a? Per esempio.

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

Funziona su un Mac

4
Andreas

Awk può correggere l'output per fornire esattamente ciò che l'interrogante ha chiesto. Sul mio sistema Solaris 10, trova -ls stampa la dimensione in KB come secondo campo, quindi:

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

In caso contrario, utilizzare -exec ls -lh e selezionare il campo dimensione dall'output. Ancora su 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

Ho lottato con questo su Mac OS X in cui il comando find non supporta -printf.

Una soluzione che ho trovato, che si basa sul "gruppo" per tutti i file che sono "staff" era ...

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

Questo suddivide l'output lungo in tre token

  1. le cose prima del testo 'staff'
  2. la dimensione del file
  3. il nome del file

E quindi genera i token 2 e 3, ovvero l'output è il numero di byte e quindi il nome del file

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

Questo dovrebbe fornirti ciò che stai cercando, inclusa la formattazione (ovvero il nome del file prima e le dimensioni successive):

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

output di esempio (dove ho usato -iname "*.php" per ottenere alcuni risultati):

./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
 $ find. -name "test *" -exec du -sh {} \; 
 4.0K ./test1[.____.[0 ./test2[.____.×0 ./test3[.____.×0. /test4
$

Riferimento Scripter World

1
scripter

Puoi provare questo:

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

Questo ti darà la dimensione in byte. Ma il comando du accetta anche i parametri -k per KB e -m per MB. Ti darà un risultato simile

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

Prova i seguenti comandi:

GNU stat:

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

BSD stat:

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

tuttavia stat non è standard, quindi du o wc potrebbe essere un approccio migliore:

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'
1
kenorb
find . -name "*.ear" -exec ls -l {} \;
0
Jeremy Weathers