2009-03-01 10 views
51

Próbuję obliczyć całkowity rozmiar w bajtach wszystkich plików (w drzewie katalogów) pasujących do wzorca nazwy pliku tylko za pomocą powłoki. Oto, co mam do tej pory:Obliczanie rozmiaru plików w powłoce

find -name * .undo -exec stat -c% s {} \; | awk '{total + = 1 $} END {drukuj łącznie}'

Czy jest to łatwiejszy sposób? Czuję, że powinien istnieć prosty przełącznik du lub find, który robi to dla mnie, ale nie mogę go znaleźć.

Żeby było jasne Chcę całkowitej plików pasujące do wzorca w dowolnym miejscu pod drzewem katalogów, co oznacza

du -bs * .undo

nie będzie działać, ponieważ tylko mecze pliki w bieżącym katalogu.

+0

W każdym razie 'du' (lub' ls') nie będzie działało powyżej kilku tysięcy plików (błąd "Lista argumentów za długo"). –

Odpowiedz

94

Spróbuj:

find . -name "*.undo" -ls | awk '{total += $7} END {print total}' 

W moim systemie wielkość pliku jest pole siódmy w wyjściu find -ls. Jeśli dane wyjściowe są różne, dostosuj.

W tej wersji korzystanie z istniejących informacji katalogowych (rozmiar pliku) i wbudowanej funkcji ls find powinno być wydajne, unikając tworzenia procesów lub plików i/o.

+2

To powinno zadziałać, ale opcja -ls do znalezienia i awk są przesadą dla tego zadania. –

+9

nie, nie przesadzaj w ogóle. – vladr

+4

Dodałbym "-type f" do polecenia find, aby zapobiec błędnej sumie, jeśli istnieją katalogi pasujące do globu "* .undo". –

-3

Sprawdź komendę du (użycie dysku).

18
du -c *pattern* 

Spowoduje to wydrukowanie sumy na ostatnim wierszu wydruku.

+1

Użyj ogona, aby przyciąć wszystkie oprócz ostatniej linii. +1. =] – strager

+6

To tylko znajdzie pliki pasujące do wzorca w bieżącym katalogu - prawda? –

+0

Możesz użyć wzorca takiego jak '*/*. Undo' ... chociaż to tylko znajdzie pliki z rozszerzeniem cofania, które są głębokie w jednym folderze ... również nie znajdzie żadnego w bieżącym katalogu. – Kasapo

8
find -name '*.undo' -exec wc -c {} + | tail -n 1 

powinien dać rzeczywistą całkowitą liczbę bajtów w plikach, jeśli nie mają zbyt wiele plików (gdzie „zbyt wiele” będzie naprawdę wiele, prawdopodobnie w tysiącach). Lub jeśli chcesz po prostu uzyskać numer w spokoju,

find -name '*.undo' -exec wc -c {} + | tail -n 1 | cut -d' ' -f 1 
+0

Powinieneś podać "* .undo", "* .undo", \ *. Cofnij lub podobne; w przeciwnym razie otrzymasz błędne wyniki, jeśli istnieje plik .undo w bieżącym katalogu. – ephemient

5

Python jest częścią większości dystrybucji Linuksa.

import os 
import fnmatch 
size= 0 
for path, dirs, files in os.walk('.'): 
    for f in files: 
     if fnmatch.fnmatch(f,'*.py'): 
      fileSize= os.path.getsize(os.path.join(path,f)) 
      print f, fileSize 
      size += fileSize 
print size 

Długie, ale doskonale przejrzyste i bardzo rozszerzalne.

35

Z zsh, można użyć rozszerzony globbing zrobić.

du -c **/* cofnąć

+4

A także Fish and Bash 4.0 – ephemient

+5

Oraz' du -ch **/*. undo', aby uzyskać czytelne dla człowieka rozmiary plików ... – student

22
find -name *.undo -print0 | du -hc --files0-from=- 
+0

wszystkie pliki Czy istnieje sposób, aby pokazać tylko sumę? Niezależnie, myślę, że jest to "poprawna odpowiedź" kandydata –

+3

Podoba mi się, ponieważ pokazuje rozmiar "czytelny dla człowieka" @ Tyler Collier, aby pokazać tylko razem użyj ogona: 'find -type f -name '* .undo' -print0 | du -hc --files0-from = - | tail -n 1' –

+0

To jest najlepsza odpowiedź, jaką kiedykolwiek widziałem na Linuksie ... ts działa również około 1000 razy szybciej niż jakakolwiek inna odpowiedź, którą widziałem, ponieważ du na pliku jest wykonywane tak szybko, a ponadto daje wynik w czytelny dla człowieka sposób: – Myforwik

3
find -name '*.undo' -print0 | du -hc --files0-from=- | tail -n 1 

ułożyła od gerdemb „s i składek strager użytkownika. Użycie du -cb powinno wyświetlić bajty.

9

Ja też patrzyłem na ten problem (tylko rok później ...) - tylko znalazłem tę stronę.

Coś, co znalazłem prace (dla mnie) jest następujący:

find /mnt/iso -name *.avi -printf "%s\n" | paste -sd+ - | bc 

ta zwróci całkowity rozmiar wszystkich plików .avi we wszystkich podfolderów poniżej/mnt/iso

muszę dać kredytu radoulov dla polecenia Wklej - patrz strony: Shell command to sum integers, one per line?

wystarczy dodać - na wszelki wypadek folder dopasowuje wyszukiwane hasło - to dobry pomysł, aby użyć -type f w poleceniu find także.

0

Co z tym prostym.

find ./ -name *.undo | xargs wc 
2

używam du polecenia tak, aby uzyskać numer tylko:

du file_list | awk '{s+=$1} END {print s}' 
0

Albo można po prostu to zrobić:

dir=$1 

for file in $dir/* ; do 

length_file=`stat -c %s $file` 
echo "File $file has length $length_file" 
length_total=`expr $length_total + $length_file` 

done 

echo "Total length: $length_total ." 

Gdzie stat wyświetla status pliku lub systemu plików . Argument -c oznacza użycie określonego formatu zamiast domyślnego, a sekwencja formatu $ s umożliwia wyświetlenie całkowitego rozmiaru bajtów.

expr 

Po prostu ocenia wyrażenie.

0

Perl jedno-liner:

find . -name "*.undo" -ls | perl -lane '$t += $F[6]; END{print $t}' 

Tablica @F autosplit rozpoczyna się indeksem $F[0] natomiast pola awk zacząć od $ 1, stąd $F[6] jest używany zamiast awk $7

0

du -c | awk '/./{line=$0} END {print $ 1}'

0

Wydaje mi się, że wersja z xargs może zostać zaimplementowana (uproszczona) ls -1 * .undo | xargs wc

Powiązane problemy