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

StackOverflow https://stackoverflow.com/questions/64649

Domanda

Se emetto il comando find come segue:

$ find . -name *.ear

Viene stampato:

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

Ciò 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
È stato utile?

Soluzione

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

solo l'h extra dalla risposta di jer.drab.org.fa risparmiare tempo convertendo mentalmente in MB ;)

Altri suggerimenti

È necessario utilizzare -exec o -printf.Printf funziona in questo modo:

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

-exec è più potente e ti consente di eseguire comandi arbitrari, quindi potresti 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, che possono fare molto di più della semplice dimensione del file.

[modifica] -printf non è nello standard POSIX ufficiale, quindi controlla se è supportato sulla tua versione.Tuttavia, la maggior parte dei sistemi moderni utilizzerà GNU find o una versione estesa simile, quindi ci sono buone probabilità che venga implementata.

una soluzione semplice è utilizzare 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 che tu 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 (-tipo f), e per ognuno stampa il nome del file (%p), una scheda ( ), la dimensione in kilobyte (%k), il suffisso " KB", e poi una nuova riga ( ).

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

Se il comando printf non formatta le cose nel modo desiderato, puoi utilizzare exec, seguito dal comando che desideri eseguire su ciascun file.Utilizzare {} come nome file e terminare il comando con un punto e virgola (;).Nella maggior parte delle shell, tutti e tre i caratteri dovrebbero essere preceduti da una barra rovesciata.

Ecco una soluzione semplice che li trova e li stampa utilizzando "ls -lh", che ti mostrerà la dimensione in formato 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 non necessarie.

Awk può correggere l'output in modo che dia proprio ciò che l'interrogante ha richiesto.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

Altrimenti, usa -exec ls -lh e seleziona 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

Perché non usarlo du -a ?Per esempio.

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

Funziona su un Mac

Ho lottato con questo su Mac OS X dove il comando trova non supporta -printf.

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

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

Questo divide l'output ls long in tre token

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

E quindi emette i token 2 e 3, ovverol'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 darti quello che stai cercando, formattazione inclusa (ad es.prima il nome del file e poi la dimensione):

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

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

./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

Potresti 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 output simile

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear
find . -name "*.ear" | xargs ls -sh
$ find . -name "test*" -exec du -sh {} \;
4.0K    ./test1
0       ./test2
0       ./test3
0       ./test4
$

Riferimento a Scripter World

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 {} \;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top