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
find . -name '*.ear' -exec ls -lh {} \;
solo il h extra dalla risposta di jer.drab.org. consente di risparmiare tempo convertendo mentalmente in MB;)
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.
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.
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 \{\} \;
find . -name '*.ear' -exec du -h {} \;
Questo ti dà solo la dimensione del file, invece di tutte le cose inutili.
Perché non usare du -a? Per esempio.
find . -name "*.ear" -exec du -a {} \;
Funziona su un Mac
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
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
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
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
$ find. -name "test *" -exec du -sh {} \; 4.0K ./test1[.____.[0 ./test2[.____.×0 ./test3[.____.×0. /test4 $
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
find . -name "*.ear" | xargs ls -sh
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 < {})"' ';'
find . -name "*.ear" -exec ls -l {} \;