Zwiększanie rozmiaru tylko dla du plików

51

Jak mogę uzyskać rozmiar wszystkich plików i wszystkich plików w podkatalogach za pomocą polecenia du.

Próbuję następujące polecenie, aby uzyskać rozmiar wszystkich plików (i plików w podkatalogach)

find . -type f | du -a

Ale to również drukuje rozmiary folderów. Jak mogę uzyskać listę rozmiarów wszystkich plików i plików w podkatalogach? Próbowałem również, exec flagale nie jestem pewien, jak potokować dane wyjściowe do innego polecenia po wykonaniu wyników findw du.

System operacyjny to AIX 6.1 z powłoką ksh.

Shardul Upadhyay
źródło

Odpowiedzi:

57

Zwykle używam tego -execnarzędzia. Lubię to:

find . -type f -exec du -a {} +

Próbowałem go zarówno na bash, jak i ksh z GNU find. Nigdy nie próbowałem systemu AIX, ale jestem pewien, że twoja wersja find ma pewną -execskładnię.

Poniższy fragment kodu sortuje listę, najpierw największy:

find . -type f -exec du -a {} + | sort -n -r | less
rahmu
źródło
3
Postawiłbym tę odpowiedź, jeśli nie masz dostępu find -print0lub innych funkcji GNU. Jeśli to możliwe, zastąpienie \;go \+spowoduje mniej wywołań, dua tym samym lepszą wydajność.
jw013,
Dzięki, działa to świetnie, zwłaszcza że du oferuje flagę wielkości w różnych jednostkach.
Shardul Upadhyay
Nie mogłem znaleźć informacji na temat +opcji. Czy to jest opcja dla duczy dla find? I dlaczego powoduje to mniej połączeń?
Amelio Vazquez-Reina,
1
Jest to standardowa opcja find. Określa execpolecenie (w naszym przypadku du) tylko raz, z wszystkimi wynikami findpodanymi jako kolejne argumenty polecenia.
rahmu
wtf, dlaczego nie ma takiego polecenia jakdu -f --threshold=1G
Alexander Mills,
16

Jeśli masz narzędzia GNU, spróbuj

find . -type f -print0 | du --files0-from=-
jw013
źródło
Komenda nie powie, że print0 nie jest prawidłową komendą, a ten ostatni minus nie był rozpoznaną flagą. Nie sądzę, aby to podejście zadziałało, ponieważ man dunie wyświetla flagi filesani fromflagi.
Shardul Upadhyay
Powinieneś dodać swój system operacyjny jako znacznik do pytania. Zakładałem, że masz GNU, ale zapomniałeś o tym wspomnieć.
jw013,
1
Głosuj na mnie! Twoje konkretne rozwiązanie działa z tym, du -chaby uzyskać całkowitą liczbę pasujących plików:find . -name 'blah blah.*' -print0 | du --files0-from=- -ch
Michael Goldshteyn
9

Ogólnie używam:

find . -type f -print0 | xargs -r0 du -a

Xargs zwykle wywołuje polecenie, nawet jeśli nie przekazano żadnych argumentów; xargs du </dev/nullnadal będzie nazywany, xargs -r du </dev/nullnie będzie dzwonił du. Te -0spojrzenia argument za znakiem NUL łańcuchów zamiast nowej linii zakończone.

Następnie zazwyczaj dodam | awk '{sum+=$1} END {print sum}'na końcu, aby uzyskać sumę.

Arcege
źródło
2
Wartość then I usually addzłota :-)
Radek
2

Oto wersja z długimi nazwami parametrów i ludzkim sortowaniem.

find . -type f -exec du --human {} + | sort --human --reverse | head

Nie widziałem też potrzeby -a/--allprzekazywania du.

Tarrasch
źródło
-2

określone pliki w bieżącym reż

du -ch files*

jest krótszy i działa dla mnie

du -sh .

dla aktualnego katalogu i wszystkich plików w sub

du (GNU coreutils) 8.30

krótki
źródło
1
(1) Co masz na myśli du -ch files*? Załóżmy, że aktualny katalog zawiera ant, apple, banana, bat, cat, corn, date, i dog, gdzie nazwy zwierząt są podkatalogi i owoców / warzyw są nazwy plików - co komenda należałoby użyć, aby uzyskać tylko te pliki? A może nie to miałeś na myśli? (2)  du -sh .zgłasza tylko wielką sumę wszystkiego w bieżącym katalogu i pod nim, a nie same pliki w ogóle. Jest to prawie dokładne przeciwieństwo tego, o które pytano.
G-Man mówi „Reinstate Monica”