Proč se "najít name * .txt |. Xargs du -HC" dát více součty?

hlasů
7

Mám velkou sadu adresářů, pro které jsem se snaží vypočítat celkový součet velikosti několika set soubory TXT. Zkoušel jsem to, který většinou funguje:

find . -name *.txt | xargs du -hc

Ale místo toho, aby mi jeden celkem na konci, mám několik. Můj odhad je, že potrubí bude procházet pouze na tolika řádky výstupu najít to v čase, a du právě pracuje u každé šarže, jak to přijde. Existuje způsob, jak vyřešit tento problém?

Dík! Alex

Položena 24/08/2009 v 18:29
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
11

Jak se o použití --files0-z umožnuje du? Budete muset vygenerovat výstupního souboru null-ukončena odpovídajícím způsobem:

find . -name "*txt" -exec echo -n -e {}"\0" \; | du -hc --files0-from=-

funguje správně na mém systému.

Odpovězeno 24/08/2009 v 18:52
zdroj uživatelem

hlasů
7
find . -print0 -iname '*.txt' | du --files0-from=-

a pokud chcete mít několik různých rozšíření mají hledat to nejlepší udělat:

find . -type f -print0 | grep -azZEi '\.(te?xt|rtf|docx?|wps)$' | du --files0-from=-
Odpovězeno 21/10/2010 v 20:57
zdroj uživatelem

hlasů
3

Další jednoduché řešení:

find . -name *.txt -print0 | xargs -0 du -hc
Odpovězeno 23/08/2012 v 17:00
zdroj uživatelem

hlasů
3

Program xargs rozbíjí věci do dávek, aby se přihlédlo k omezení z důvodu maximální délky příkazového řádku UNIX. Je to ještě efektivnější než provozovat své dílčí jeden po druhém, ale po dlouhém seznamu vstupů, bude to spustit příkaz tolikrát, že každá „run“ je natolik krátká, že to nezpůsobí problémy.

Z tohoto důvodu, jste pravděpodobně viděli jeden výstupní řádek za „dávku“, která xargs musí běžet.

Vzhledem k tomu může být užitečné / zajímavé, může být člověk strana nalezeno online zde: http://unixhelp.ed.ac.uk/CGI/man-cgi?xargs


Jedna jiná věc na vědomí (a to může být překlep v příspěvku nebo mé nepochopení) je to, že máte „* .txt“ upravenou / uvozovkách. Tedy máte

find . -name *.txt | xargs du -hc

kde budete chtít

find . -name \*.txt | xargs du -hc

S tím rozdílem, že v příkazovém řádku může být expandování * do seznamu názvů souborů, které odpovídají ... spíše než absolvování * do nálezu, který ji použije jako vzor.

Odpovězeno 24/08/2009 v 18:31
zdroj uživatelem

hlasů
0

Jedno alternativní řešení je použít bash forsmyčky:

for i in `find . -name '*.txt'`; do du -hc $i | grep -v 'total'; done

To je dobré, když budete potřebovat větší kontrolu o tom, co se děje ve smyčce.

Odpovězeno 30/03/2015 v 10:45
zdroj uživatelem

hlasů
0

Jedno alternativní řešení je použít awk:

find . -name "*.txt" -exec ls -lt {} \; | awk -F " " 'BEGIN { sum=0 } { sum+=$5 } END { print sum }'
Odpovězeno 24/08/2009 v 18:47
zdroj uživatelem

hlasů
0

xargs busty svůj vstup do přiměřené velikosti kousky - to, co vidíte, jsou součty pro každý z těchto bloků. Zkontrolujte, zda v manuálové stránce xargs na způsoby, jak nakonfigurovat svou manipulaci vstupu.

Odpovězeno 24/08/2009 v 18:31
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more