2008-09-15 7 views

Odpowiedz

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

tylko h dodatkowe z odpowiedzi jer.drab.org. oszczędza czas konwertując do MB mentalnie;)

+6

Ta wersja wykona proces "ls" dla każdego pliku. Jeśli masz wiele plików (powiedzmy ponad tysiąc), lepiej zoptymalizuj to poprzez: 'find. -name '* .ear' -exec ls -lh {} + \; '(rozszerzenie GNU) lub ' find. -name '* .ear' -print0 | xargs -0 ls -lh'. Możesz również dodać '-type f', jeśli interesują cię tylko pliki (lub dodaj' -d' do ls, jeśli chcesz, aby katalogi były zawarte bez ich zawartości). – ash108

+1

Twoja odpowiedź nie wyklucza katalogów, więc skończysz także na katalogach, co oczywiście nie jest właściwe. –

+1

To naprawdę nieskuteczny sposób robienia rzeczy - i niestety komentarze ash108 również nie są idealne. Znacznie lepiej jest użyć opcji -printf, aby znaleźć. – oskarpearson

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

można spróbować to:

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

Daje to rozmiar w bajtach. Ale polecenie du akceptuje również parametry -k dla KB i -m dla MB. To daje moc jak

5000 ./dir1/dir2/earFile1.ear 
5400 ./dir1/dir2/earFile2.ear 
5400 ./dir1/dir3/earFile1.ear 
17

prostym rozwiązaniem jest skorzystanie z opcji -ls w znalezisku:

find . -name \*.ear -ls 

To daje każdego wpisu w normalny „ls -l” format. Lub, aby uzyskać konkretne wyjście, którego szukasz, to:

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

Która da ci nazwę pliku, a następnie rozmiar w KB.

74

Musisz użyć -exec lub -printf. Printf działa tak:

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

-exec jest bardziej wydajny i pozwala na wykonywanie dowolnych poleceń - tak można użyć wersji „ls” lub „wc” wydrukować nazwę pliku wraz z innymi informacjami. "man find" pokaże ci dostępne argumenty dla printf, które mogą zrobić o wiele więcej niż tylko rozmiar pliku.

[edytuj] -printf nie jest w oficjalnym standardzie POSIX, więc sprawdź, czy jest on obsługiwany w Twojej wersji. Jednak większość nowoczesnych systemów będzie używać GNU find lub podobnie rozszerzonej wersji, więc istnieje duża szansa, że ​​zostanie ona zaimplementowana.

+0

To wygląda Twój przykład jest bardziej precyzyjne, ale nie wydaje się uzyskać przykładem dla pracuję nad Solaris 10. –

+0

Obawiam się, że Solaris find nie obsługuje -printf w ogóle: http://jrwren.wrenfam.com/blog/2006/10/07/solaris-find-sucks/ http: //www.cs.bgu.ac.il/~arik/usail/man/solaris/find.1.html Możesz zainstalować GNU find, jeśli możesz przeszkadzać, w przeciwnym razie musisz użyć exec lub | jak sugerują inni. –

+1

+1 Wydaje się to być bardziej przejrzyste. Aby sformatować wyjście, wolałbym dodać polecenie 'column'. 'znajdź. -name * .ear -printf "% p% k KB \ n" | kolumna -t' – Amol

13

Używając gnu find, myślę, że właśnie tego chcesz. Znajduje wszystkie prawdziwe pliki, a nie katalogi (typ-f), a dla każdego drukuje nazwę pliku (% p), kartę (\ t), rozmiar w kilobajtach (% k), przyrostek "KB", a następnie znak nowej linii (\ n).

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

Jeśli polecenie printf nie formatować rzeczy tak, jak chcesz, możesz użyć exec, a następnie za pomocą polecenia chcesz wykonać na każdym pliku. Użyj {} dla nazwy pliku i zakończ polecenie średnikiem (;). W większości powłok wszystkie trzy z tych znaków powinny być ujęte odwrotnym ukośnikiem.

Oto proste rozwiązanie, które wyszukuje i wypisuje je używając „ls lH”, który pokaże wielkość w postaci czytelnej dla człowieka (k dla kilobajtów M dla megabajtów):

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

Jak jeszcze inna alternatywa, „wc -c” wypisze liczbę znaków (bajtów) w pliku:

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

+1 Z wyjątkiem pominięcia '-name '* .ear'' w przykładach, powinna to być odpowiedź numer jeden. Odpowiada dokładnie na pytanie, wyjaśnia znaczenie składni i podaje wiele alternatyw. – OsakaWebbie

+0

to powinna być akceptowana odpowiedź, ponieważ nie uruchamia nowego polecenia dla każdej linii, dlatego jest znacznie szybsza niż aktualnie akceptowana z nieśmiałego – jirislav

3

awk można naprawić wyjście dać tylko to, co pytający poprosił. W moim systemie Solaris 10, znaleźć -ls drukuje rozmiar w KB jako drugim polu, więc:

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

inaczej, stosować -exec ls lH i wybrać pole powierzchni od wyjścia. Znowu na 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

Walczyłem z tym na Mac OS X, w którym polecenie find nie obsługuje -printf.

Rozwiązanie, które znalazłem, że co prawda opiera się na „grupy” dla wszystkich plików jest „zespół” był ...

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

ten dzieli ls długiej wyjście na trzy żetony

  1. rzeczy przed tekstem wielkości
  2. plik „Personel”
  3. nazwa pliku

a następnie przesyła znaki 2 i 3, to znaczy wyjście jest liczbą bajtów i filename

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

Może wykorzystywać du -a? Na przykład.

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

działa na Mac

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

to daje tylko rozmiar pliku, zamiast wszystkie niepotrzebne rzeczy.

+0

"wc" działa na to po prostu lepiej, jeśli potrzebujesz rozmiaru w bajtach. – Alex

1

To powinno Ci dać to, czego szukasz, włączając formatowanie (tj.Pierwsza nazwa pliku i rozmiar później):

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

wyjście próbki (gdzie użyłem -iname "*.php" dostać jakiś rezultat):

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

Spróbuj wykonać następujące polecenia:

GNU stat:

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

BSD stat:

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

jednak stat nie jest standardem, więc du lub wc mogłyby być lepsze podejście:

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';' 
Powiązane problemy