it-swarm-eu.dev

Jak spočítám všechny soubory rekurzivně prostřednictvím adresářů

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.

52
xenoterracide
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
...
67
Shawn J. Goff

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.

17
herohuyongtao

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
13
DolphinDream

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
12
Cry Havok

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.

4
mouviciel

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
2
abeboparebop

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
...
2
jimmij

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.

duinody

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).

Další informace

Pokud se nechcete opakovat (což může být užitečné v jiných situacích), přidejte

-S, --separate-dirs
1
Sridhar Sarnobat

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“.

1
Demi-Lune