Řešení 1:
Nečekejte, že to proběhne rychle...
cd do adresáře, kde se domníváte, že by mohl být podadresář se spoustou inodů. Pokud tento skript zabere obrovské množství času, pravděpodobně jste našli, kde v souborovém systému hledat. /var je dobrý začátek...
V opačném případě, pokud přejdete do nejvyššího adresáře v daném souborovém systému, spustíte jej a počkáte na dokončení, najdete adresář se všemi inody.
find . -type d |
while
read line
do
echo "$( find "$line" -maxdepth 1 | wc -l) $line"
done |
sort -rn | less
O náklady na třídění se nebojím. Provedl jsem test a třídění tohoto neseřazeného výstupu proti 350 000 adresářům trvalo 8 sekund. Prvotní nález trval . Skutečnou cenou je otevření všech těchto adresářů ve smyčce while. (samotná smyčka trvá 22 sekund). (Testovací data byla spuštěna v podadresáři s 350 000 adresáři, z nichž jeden měl milion souborů, zbytek měl 1 až 15 adresářů).
Různí lidé poukazovali na to, že ls v tom není skvělé, protože třídí výstup. Zkoušel jsem echo, ale to také není skvělé. Někdo jiný poukázal na to, že stat poskytuje tyto informace (počet záznamů v adresáři), ale že to není přenosné. Ukázalo se, že find -maxdepth je opravdu rychlý při otevírání adresářů a počítá .soubory, takže... tady je... body pro každého!
Řešení 2:
Pokud je problém v jednom adresáři s příliš mnoha soubory, zde je jednoduché řešení:
# Let's find which partition is out of inodes:
$ df -hi
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 2.4M 2.4M 0 100% /
...
# Okay, now we know the mount point with no free inodes,
# let's find a directory with too many files:
$ find / -xdev -size +100k -type d
Myšlenka za find
řádek je, že velikost adresáře je úměrná množství souborů přímo v tomto adresáři. Zde tedy hledáme adresáře se spoustou souborů uvnitř.
Pokud nechcete hádat číslo a dáváte přednost vypsání všech podezřelých adresářů seřazených podle "velikosti", je to také snadné:
# Remove the "sort" command if you want incremental output
find / -xdev -size +10k -type d -printf '%s %p\n' | sort -n
Řešení 3:
Grrr, komentování vyžaduje 50 opakování. Takže tato odpověď je vlastně komentářem k Chrisově odpovědi.
Vzhledem k tomu, že tazatele pravděpodobně nezajímají všechny adresáře, pouze ty nejhorší, je použití řazení pravděpodobně velmi drahé.
find . -type d |
while
read line
do
echo "$(ls "$line" | wc -l) $line"
done |
perl -a -ne'next unless $F[0]>=$max; print; $max=$F[0]' | less
Toto není tak úplné jako vaše verze, ale vytiskne to řádky, pokud jsou větší než předchozí maximum, což výrazně snižuje množství vytištěného šumu a šetří náklady na třídění.
Nevýhodou je, že pokud máte 2 velmi velké adresáře a první má o 1 inode více než 2., nikdy neuvidíte 2.
Úplnějším řešením by bylo napsat chytřejší skript v perlu, který by sledoval 10 nejsledovanějších hodnot a na konci je vytiskl. Ale to je příliš dlouho na rychlou odpověď na chybu serveru.
Také některé středně chytřejší skriptování v perlu vám umožní přeskočit smyčku while – na většině platforem třídí výsledky ls, což může být u velkých adresářů také velmi drahé. Třídění ls zde není nutné, protože nás zajímá pouze počet.
Řešení 4:
Můžete použít tento malý úryvek:
find | cut -d/ -f2 | uniq -c | sort -n
Vytiskne, kolik souborů a adresářů je v každém z adresářů v aktuální složce, přičemž největší pachatelé jsou dole. Pomůže vám najít adresáře, které mají hodně souborů. (více informací)
Řešení 5:
Toto není přímá odpověď na vaši otázku, ale vyhledávání nedávno upravených souborů s malou velikostí pomocí funkce find může zúžit vyhledávání:
find / -mmin -10 -size -20k