Chci vidět, kolik souborů je v podadresářích, abych zjistil, kde je veškeré využití inodu v systému. Něco jako bych to udělal pro využití vesmíru
du -sh /*
což mi poskytne prostor použitý v adresářích mimo kořenový adresář, ale v tomto případě chci počet souborů, ne velikost.
find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Díky Gilles a xenoterracidu za opravy bezpečnosti/kompatibility.
První část: find -maxdepth 1 -type d
vrátí seznam všech adresářů v aktuálním pracovním adresáři. To je potrubí k ...
Druhá část: while read -r dir; do
začíná smyčku while - dokud je trubka přicházející do while otevřená (což je do odeslání celého seznamu adresářů), příkaz read umístí další řádek do proměnné "dir". Pak to pokračuje ...
Třetí část: printf "%s:\t" "$dir";
vytiskne řetězec v "$ dir" (který drží jeden z názvů adresářů), za kterým následuje záložka.
Čtvrtá část: find "$dir -f file"
vytvoří seznam všech souborů uvnitř názvu adresáře uloženého v "$ dir". Tento seznam je odeslán na ..
Pátá část: wc -l;
počítá počet řádků, které jsou odeslány na standardní vstup.
Poslední část: done
jednoduše ukončí smyčku while.
Dostaneme tedy seznam všech adresářů v aktuálním adresáři. Pro každý z těchto adresářů vygenerujeme seznam všech souborů v něm, abychom je mohli spočítat všechny pomocí wc -l
. Výsledek bude vypadat takto:
./dir1: 234
./dir2: 11
./dir3: 2199
...
Snaž se find . -type f | wc -l
, bude to spočítat všechny soubory v aktuálním adresáři i všechny soubory v podadresářích. Všimněte si, že všechny adresáře nebudou počítány jako soubory, pouze běžné soubory.
Zde je kompilace některých užitečných příkazů se seznamem (opětovné hashování na základě předchozího kódu uživatele):
Seznam složek s počtem souborů:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); printf "%4d : %s\n" $n "$dir"; done
Seznam složek s nenulovým počtem souborů:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
Seznam složek s počtem podsložek:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; printf "%4d : %s\n" $n "$dir"; done
Seznam složek s nenulovým počtem podsložek:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
Vypsat prázdné složky:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -eq 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
Seznam neprázdných složek s počtem obsahu:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
Snaž se:
find /path/to/start/at -type f -print | wc -l
jako výchozí bod, nebo pokud se opravdu chcete opakovat pouze v podadresářích adresáře (a přeskočit soubory v tomto adresáři nejvyšší úrovně)
find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l
Následující řešení počítá skutečný počet použitých inodů počínaje aktuálním adresářem:
find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l
Chcete-li získat počet souborů stejné podmnožiny, použijte:
find . | wc -l
U řešení zkoumajících pouze podadresáře, aniž byste brali v úvahu soubory v aktuálním adresáři, se můžete podívat na další odpovědi.
OS X 10.6 škrtí příkaz v přijaté odpovědi, protože neurčuje cestu pro find
. Místo toho použijte:
find . -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Vím, že jdu pozdě na párty, ale věřím, že toto čisté řešení bash
(nebo jiné prostředí Shell, které akceptuje hvězdu glob) může být v některých situacích mnohem rychlejší:
shopt -s globstar # to enable ** glob in bash
for dir in */; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[*]}"; done
výstup:
d1/: 302
d2/: 24
d3/: 640
...
Zkuste to:
find -type d -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"'
Mělo by to fungovat dobře, pokud názvy souborů neobsahují nové řádky.
Nejsem si jistý, proč si nikdo (včetně mě) nebyl vědom:
du --inodes
--inodes
list inode usage information instead of block usage
Jsem si jistý, že to vyřeší problém OP. Začal jsem to hodně používat, abych zjistil, kde jsou všechny ty nevyžádané věci v mých obrovských discích (a přenesu je na starší disk).
Pokud se nechcete opakovat (což může být užitečné v jiných situacích), přidejte
-S, --separate-dirs
Pokud máte nainstalovaný ncdu
(musíte mít, když chcete provést nějaké vyčištění), jednoduše zadejte c
do "Přepnout zobrazení počtu podřízených položek". A C
na „Seřadit podle položek“.