Pokaż sumę rozmiarów plików na liście katalogów

71

Polecenie dirlistowania katalogów Windows ma na końcu wiersz pokazujący całkowitą ilość miejsca zajmowanego przez wymienione pliki. Na przykład dir *.exepokazuje wszystkie .exepliki w bieżącym katalogu, ich rozmiary i sumę ich rozmiarów. Chciałbym mieć podobną funkcjonalność z moim diraliasem w bash, ale nie jestem pewien, jak to zrobić.

Obecnie mam alias dir='ls -FaGl'w swoim .bash_profilepokazie

drwxr-x---+  24 mattdmo  4096 Mar 14 16:35 ./
drwxr-x--x. 256 root    12288 Apr  8 21:29 ../
-rw-------    1 mattdmo 13795 Apr  4 17:52 .bash_history
-rw-r--r--    1 mattdmo    18 May 10  2012 .bash_logout
-rw-r--r--    1 mattdmo   395 Dec  9 17:33 .bash_profile
-rw-r--r--    1 mattdmo   176 May 10  2012 .bash_profile~
-rw-r--r--    1 mattdmo   411 Dec  9 17:33 .bashrc
-rw-r--r--    1 mattdmo   124 May 10  2012 .bashrc~
drwx------    2 mattdmo  4096 Mar 24 20:03 bin/
drwxrwxr-x    2 mattdmo  4096 Mar 11 16:29 download/

na przykład. Biorąc odpowiedzi na to pytanie :

dir | awk '{ total += $4 }; END { print total }'

co daje mi sumę, ale nie drukuje samej listy katalogów. Czy istnieje sposób, aby zmienić to w skrypt jednowierszowy lub skrypt powłoki, aby móc przekazać dowolne lsargumenty diri uzyskać pełną listę plus suma sumy? Na przykład chciałbym uruchomić, dir -R *.jpg *.tifaby uzyskać listę i całkowity rozmiar tych typów plików we wszystkich podkatalogach. Idealnie byłoby świetnie, gdybym mógł uzyskać rozmiar każdego podkatalogu, ale nie jest to konieczne.

MattDMo
źródło
5
Dlaczego ci nie ls -lhpomaga? Drukuje całkowitą sumę na górze. Możesz także uruchomić, du -sh *.exeaby uzyskać informacje o użyciu miejsca na dysku w postaci czytelnej dla człowieka.
bagavadhar 16.04.13
@ashwin Nie wiem, co ls -lhdrukuje „suma” , ale nie zawsze jest to związane z tym, co awkobliczają poniższe skrypty lub co sumuję ręcznie. Czasami jest zbliżona do liczby KB plików w katalogu, ale wydaje się, że nie stosuje przydzielonych rozmiarów podkatalogów. Byłbym wdzięczny, gdybyś mógł wskazać mi, czym dokładnie jest ta liczba ...
MattDMo 17.04.13
sprawdź, czy moja odpowiedź poniżej Ci odpowiada
bagavadhar,
1
ls -lhnie pokazuje całkowitej wielkości
katalogu

Odpowiedzi:

25

Poniższa funkcja wykonuje większość zadań, o które prosisz:

dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; }

... ale nie da ci tego, o co prosisz dir -R *.jpg *.tif, bo to nie tak ls -Rdziała. W tym celu możesz skorzystać z findnarzędzia.


źródło
1
Jest to prawdą, jeśli szukasz zasadniczo rozmiaru zawartości każdego pliku, NIE rozmiaru pliku zużywanego na dysku. To rozróżnienie jest bardziej wyraźne w przypadku bardzo małych plików. W mojej dystrybucji każdy plik ma przydzielone miejsce na dysku w porcjach po 4 KB (tak więc plik 300 bajtów nadal używa 4K na dysku, jak podaje polecenie du). Biorąc pod uwagę, że właśnie tego OP szukał „ile miejsca zajmuje każdy plik”, to du jest na to sposobem.
Jon V
1
dirto już nazwa popularnego GNU coreutil, raczej nie nazwałbym takiej funkcji.
deser
Napraw to, aby działało zarówno w systemie Linux, jak i OS-S, a Twój „-a” zawiera „.” i „..”, co nie jest dobre:) Oto ustalone polecenie: dir () {ls -FAl "$ {@}" | awk ”{ogółem + = 5 USD; drukuj}; END {print "total:" total} '; }
Dmitry Shevkoplyas
148

Jest już na to polecenie UNIX: du

Po prostu zrób:

du -ach 

Zgodnie z konwencją na końcu polecenia można dodać jedną lub więcej ścieżek do plików lub katalogów. -hjest rozszerzeniem do konwersji rozmiaru na format przyjazny dla człowieka, -adaje „pozorny” rozmiar (rozmiar pliku zamiast użycia dysku) i -cdaje sumę końcową.

Pete Cornell
źródło
12
Tak, du działa dobrze. Możesz użyć opcji -c (tak samo jak --total), aby uzyskać sumę na końcu listy.
MikeB
6
Zauważ, że dupodaje użycie dysku, a nie sumę rozmiarów plików.
Stéphane Chazelas,
7
du -hnie sumuje rozmiarów przekazywanych do niego plików. du -h *.sopokazuje rozmiar każdego pliku, ale nie sumę. Myślę, że to, czego tu chcesz, to du -hc *.so(a nawet du -hc *.so | tail -1). Ale oczywiście chce też listy katalogów.
Ograniczone Zadośćuczynienie
1
To polecenie działa tylko z krótką listą plików. Zobacz, co się stanie, gdy będziesz mieć 850000 plików w katalogu !!!
Hamid FzM
3
! -aoznacza --all. Rozważ raczej użycie--apparent-size
Arnauld VM
17

Możesz użyć du -h -c directory|tail -1

To wygeneruje pojedynczą linię z wykorzystaniem pamięci.

Mani Deepak
źródło
15
du -hs directoryjeśli chcesz tylko sumę.
Stéphane Chazelas,
8

Wystarczy wydrukować bieżący wiersz, który sumujesz:

dir | awk '{ print; total += $4 }; END { print "total size: ",total }'
Mauritz Hansen
źródło
6

z perlem:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

Rozmiar wszystkich nie ukrytych plików PDF w bieżącym katalogu.

ingopingo
źródło
1

Dodanie następującego do .bash_profile lub .bashrc działa dla mnie.

dir ()
{
find . -iname "$@" -exec ls -lh {} \;
find . -iname "$@" -print0|xargs -r0 du -csh|tail -n 1;
}

Teraz, gdy robię katalog * .mp3, robi to rekurencyjnie i drukuje sumę na końcu. Możesz kontrolować, ile głębokości chcesz, dodając parametr maxdepth do znalezienia. Wiem, że bieganie dwa razy nie jest bardzo skutecznym pomysłem. Ale nie mogłem wymyślić lepszego sposobu. Przynajmniej wykonuje zadanie.

bagavadhar
źródło
1

Użycie instrukcji du i awk , takich jak wspomniana powyżej, zapewni to, czego szukasz.

Przykład: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

Spowoduje to wyświetlenie listy wszystkich plików w folderze Pobrania użytkownika abc o rozszerzeniu .jpg i wydrukowanie sumy wszystkich tych plików na końcu listy.

użytkownik3085123
źródło
0

Aby uzyskać zarówno dane wyjściowe, jak i obliczenia rozmiaru, bez korzystania z innych proponowanych opcji, możesz użyć tee (1) i podstawienia procesu ...

dir | tee >( awk '{ total += $4 }; END { print total }' )
Janis
źródło
Nie ma potrzeby tee, po prostudir | awk '{print; total += $4}; END {print total}'
Stéphane Chazelas
0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'
Tamer Mansour
źródło
3
Po pierwsze, samo wydanie polecenia nie jest odpowiedzią. Po drugie, jeśli zechciałbyś przeczytać całe pytanie, inne odpowiedzi i moje komentarze, zobaczyłbyś, że to NIE jest to, czego chcę.
MattDMo
Aby być uczciwym wobec plakatu, jest to pierwszy wynik wyszukiwania w wyszukiwarce Google linux sum human readable sizesi właśnie tego szukam.
Sridhar Sarnobat
-2
du * | awk -v sum=0 '{print sum+=$1}' | tail -1
Jason
źródło
To nie robi tego, o co prosiłem.
MattDMo