Řešení
Zadáním volby -c
(nebo --total
) až du(1)
, můžete mu dát pokyn, aby vytvořil celkový součet. Pokud vaše implementace du(1)
podporuje kteroukoli z těchto možností, požadovaného efektu dosáhnete pomocí následujícího příkazu:
$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +
UPRAVIT: Všimněte si, že pokud počet souborů překročí maximální počet parametrů povolených vaším systémem, find
může stále provádět command
vícekrát. Některé implementace du(1)
také podporuje čtení názvů souborů ze souboru, který netrpí zmíněným omezením:
$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames
Vysvětlení
Rozdíl mezi sémantikou -exec command {} \;
a -exec command {} +
je následující:
-
command {} \;
provedecommand
jednou pro každý výsledekfind
. Místo{}
se předá cesta k výsledku .$ touch 1 2 3 $ find 1 2 3 -maxdepth 0 -exec echo {} \; 1 2 3
-
command {} +
provedecommand
, když byly načteny všechny výsledky. Místo{}
jsou předány cesty k výsledkům .$ touch 1 2 3 $ find 1 2 3 -maxdepth 0 -exec echo {} + 1 2 3
-print0
volba způsobí find(1)
vytisknout nalezené názvy souborů na standardní výstup oddělený znakem null a --files0-from
volba způsobila du(1)
číst názvy souborů oddělené nulou. Na rozdíl od znaku nového řádku se v názvu souboru nemusí objevit znak null, takže výstup je jednoznačný.
Chcete-li se dozvědět více o možnostech du(1)
a find(1)
, měli byste se podívat na příslušné manuálové stránky:
$ man du
$ man find
Zkuste toto:
du -c `find . -name 'flibble*' -ctime +90` | tail -1
Původní příkaz dává du jeden argument a pak jej provádí, dokud neprojde všechny argumenty. Tímto způsobem jednoduše dáte všechny argumenty najednou, poté odříznete jednotlivé velikosti a ponecháte pouze součet. Pokud chcete, můžete odstranit trubku a konec a zobrazit velikost každého souboru.
Můžete zkusit toto:
find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total