Chcę znać rozmiar pliku z rozszerzeniem .o (plik obiektowy) w moim folderze domowym.
Mogę znaleźć wszystkie pliki obiektów za pomocą
find . -name '*.o'
Jak mogę teraz obliczyć całkowity rozmiar tych plików?
źródło
Chcę znać rozmiar pliku z rozszerzeniem .o (plik obiektowy) w moim folderze domowym.
Mogę znaleźć wszystkie pliki obiektów za pomocą
find . -name '*.o'
Jak mogę teraz obliczyć całkowity rozmiar tych plików?
Szukasz potoków ( |
). Są sposobem łączenia wielu poleceń i przekazywania danych wyjściowych jednego polecenia jako danych wejściowych do drugiego. W takim przypadku chcesz przekazać wszystkie nazwy plików, które znajdziesz jako dane wejściowe du
(które obliczają rozmiar). Ponieważ jednak du
oczekuje , że nazwy plików, a wyniki find
są tylko listą tekstu (tak, tekst składa się z nazw plików, ale du
nie wie, że wszystko, co widzi, to tekst), musisz użyć czegoś takiego, xargs
który weźmie każdy wiersz tekstu, potraktuj go jak nazwę pliku i przekaż go do du
. Łącząc to wszystko, otrzymujemy:
find . -name "*.o" | xargs du -sch
zawsze powinieneś cytować wzory, które podajesz find
(tak jak ja powyżej "*.o"
:). Jeśli nie, powłoka rozwinie *.o
nazwy wszystkich pasujących plików w bieżącym katalogu. W tym przypadku działało tylko dlatego, że nie masz pasujących plików.
Te -sch
flagi dla du
dokumentowane są w man du
:
-c, --total
produce a grand total
-h, --human-readable
print sizes in human readable format (e.g., 1K 234M 2G)
-s, --summarize
display only a total for each argument
Należy jednak pamiętać, że to się nie powiedzie w przypadku nazw plików zawierających białe znaki. Prawie na pewno nie będzie to problemem dla plików obiektowych, ale w przyszłości, jeśli będziesz musiał również zajmować się spacjami, użyj:
find . -name "*.o" -print0 | xargs -0 du -sch
Te -print0
marki find
wydrukować NULL rozdzielone linie i -0
marki xargs
podjęcia takich linii jak wejścia.
Alternatywnie możesz find
wydrukować same rozmiary, a następnie zsumować je:
find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'
Obejdzie to również problem wspomniany przez @Serg w komentarzach, w których jest zbyt wiele argumentów, a polecenie jest podzielone na osobne polecenia.
Jeśli używasz bash
(prawdopodobnie używasz), istnieje prostszy sposób:
shopt -s globstar
du -sch **/*.o
Te shopt globstar
marki dowodzenia **
pasują do wszystkich plików i podkatalogów lub więcej. Po włączeniu **/*.o
dopasuje wszystkie pliki (i katalogi), których nazwa kończy się na .o
, więc możemy przekazać to bezpośrednio do du
.
Zauważ, że w przeciwieństwie do tego find
podejścia, nie będzie to pasowało do ukrytych plików (tych, których nazwa zaczyna się na a .
). Aby je również dopasować, wykonaj:
shopt -s dotglob globstar
du -sch **/*.o
du
i powstanie wieletotal
linii. Oto przykład: paste.ubuntu.com/23092752shopt globstar
przykład pomija-s
; Musiałem użyćshopt -s globstar
podobnego do twojego drugiego przykładu.shopt OPTION
bez-s
lub lub-u
(lub innej opcji, zobaczhelp shopt
) po prostu drukuje bieżącą wartość OPCJI. Musiszshopt -s OPTION
je włączyć ishopt -u OPTION
wyłączyć.Użyj
-exec
flagi, aby uruchomićdu
polecenie z;
(co oznacza dla każdego pliku)Przykładowe dane wyjściowe:
find
jest rekurencyjny - co oznacza, że przechodzi przez wszystkie podkatalogi. Jeśli chcesz tylko uzyskać wszystkie*.o
pliki w bieżącym katalogu, po prostu zróbźródło
z perlem:
Rozmiar wszystkich nie ukrytych plików PDF w bieżącym katalogu.
źródło
.o
plików i mogą znajdować się w podkatalogach. Możesz także dodać}{
wcześniej,print $sum
aby uniknąć drukowania sumy dla każdej iteracji. Chcemy tylko ostatniego.