Widziałem to pytanie przy przepełnieniu stosu, ale nie podobała mi się żadna z odpowiedzi, a tak naprawdę to pytanie powinno być tutaj na U&L.
Zasadniczo dla każdego pliku w systemie plików używana jest i-węzeł. Skończyły się i-węzły, co oznacza, że masz dużo małych plików. Tak naprawdę pytanie brzmi: „w którym katalogu znajduje się duża liczba plików?”
W tym przypadku systemem plików, na którym nam zależy, jest główny system plików /
, więc możemy użyć następującego polecenia:
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n
Spowoduje to zrzucenie listy każdego katalogu w systemie plików poprzedzonym liczbą plików (i podkatalogów) w tym katalogu. Tak więc katalog z największą liczbą plików będzie na dole.
W moim przypadku wygląda to następująco:
1202 /usr/share/man/man1
2714 /usr/share/man/man3
2826 /var/lib/dpkg/info
306588 /var/spool/postfix/maildrop
Więc w zasadzie /var/spool/postfix/maildrop
zużywa wszystkie i-węzły.
Uwaga: ta odpowiedź zawiera trzy zastrzeżenia, o których mogę myśleć. Nie obsługuje poprawnie niczego z nowymi liniami na ścieżce. Wiem, że mój system plików nie ma plików z nowej linii, a ponieważ jest to tylko wykorzystywane do spożycia przez ludzi, potencjalny problem nie jest wart rozwiązywania (i zawsze można wymienić \n
ze \0
i używać sort -z
powyżej). Nie obsługuje również, jeśli pliki są rozproszone w dużej liczbie katalogów. Nie jest to jednak prawdopodobne, więc uważam ryzyko za dopuszczalne. Policzy również twarde linki do tego samego pliku (więc używając tylko jednego i-węzła) kilka razy. Ponownie mało prawdopodobne jest podanie fałszywych wyników pozytywnych
Głównym powodem, dla którego nie podobały mi się żadne odpowiedzi w odpowiedzi na przepełnienie stosu, jest to, że wszystkie przekraczają granice systemu plików. Ponieważ mój problem dotyczył głównego systemu plików, oznacza to, że przejdzie on przez każdy zamontowany system plików. Rzucanie -xdev
komend find nawet nie działałoby poprawnie.
Na przykład najbardziej pożądana odpowiedź to:
for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
Jeśli zamiast tego zmienimy to na
for i in `find . -xdev -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
mimo że /mnt/foo
jest to mount, jest to także katalog w głównym systemie plików, więc się pojawi find . -mount -type d
, a następnie zostanie przekazany do ls -a $i
, który zanurkuje w mount.
find
W mojej odpowiedzi zamiast wymienia katalog każdego pojedynczego pliku na górze. Zasadniczo ze strukturą pliku, taką jak:
/foo/bar
/foo/baz
/pop/tart
kończymy z
/foo
/foo
/pop
Musimy tylko policzyć liczbę zduplikowanych linii.
/tmp
a następnie system jest skonfigurowany do montowania tmpfs/tmp
. Wtedy nie będziesz w stanie znaleźć plikówfind
samodzielnie. Mało prawdopodobne, że senario, ale warte odnotowania.-printf
wydaje się być rozszerzeniem GNU do znalezienia, ponieważ wersja BSD dostępna w OS X go nie obsługuje.To jest odesłane stąd na żądanie pytającego:
A jeśli chcesz pozostać w tym samym systemie plików, robisz:
Oto kilka przykładowych danych wyjściowych:
TERAZ Z LS:
Kilka osób wspomniało, że nie mają aktualnych coreutils, a opcja --inodes nie jest dla nich dostępna. Oto ls:
Jeśli jesteś ciekawy, serce i dusza tego nużącego fragmentu
regex
zastępujefilename
w każdym zls's
rekurencyjnych wyników wyszukiwania nazwą katalogu, w którym został znaleziony. Stamtąd wystarczy wycisnąć powtarzające się numery i-węzłów, a następnie policzyć powtarzające się nazwy katalogów i odpowiednio posortować.-U
Opcja jest szczególnie przydatna przy sortowania tym, że specjalnie nie nie sortowania, a zamiast tego zawiera listę katalogów w oryginalnej kolejności - czyli, innymi słowy, przezinode
liczbę.I oczywiście
-1
jest niezwykle pomocny, ponieważ zapewnia pojedynczy wynik na linię, niezależnie od ewentualnego uwzględnienia nowych linii w nazwach plików lub innych spektakularnie niefortunnych problemów, które mogą wystąpić podczas próby analizy listy.I oczywiście
-A
dla wszystkich, dla i--i
węzłów i-R
rekurencyjnych, i to jest długa i krótka z tego.Podstawową metodą tego jest to, że zastępuję każdą z nazw plików ls zawierającą nazwę katalogu w sed. Po tym ... Cóż, jestem trochę rozmyty. Jestem całkiem pewien, że dokładnie zlicza pliki, jak widać tutaj:
To zapewnia mi prawie identyczne wyniki z
du
poleceniem:DU:
LS:
Myślę, że
include
rzecz zależy tylko od tego, który katalog najpierw program wygląda - ponieważ są to te same pliki i są połączone. Trochę jak powyższa rzecz. Mogę się jednak mylić - i z zadowoleniem przyjmuję korektę ...DU DEMO
Utwórz katalog testowy:
Niektóre katalogi dzieci:
Zrób kilka plików:
Niektóre twarde linki:
Spójrz na twarde linki:
Są liczeni sami, ale idź o jeden katalog wyżej ...
Następnie uruchomiłem mój uruchomiony skrypt od dołu i:
A Graeme's:
Myślę więc, że to pokazuje, że jedynym sposobem zliczania i-węzłów jest użycie i-węzła. A ponieważ zliczanie plików oznacza zliczanie i-węzłów, nie można podwójnie zliczać i-węzłów - aby dokładnie zliczyć pliki, nie można zliczyć więcej niż raz.
źródło
--inodes
? które „warianty” / „smaki” / „posix-wannabes” / „implementacje” / cokolwiek to ma?Użyłem odpowiedzi z SO Q&A zatytułowanej: Gdzie są używane wszystkie moje i-węzły? kiedy nasz NAS skończył się około 2 lata temu:
Przykład
Sprawdzanie i-węzłów urządzenia
W zależności od serwera NAS może nie oferować w pełni funkcjonalnego
df
polecenia. W takich przypadkach możesztune2fs
zamiast tego użyć :Przekraczanie granic systemu plików
Możesz użyć
-xdev
przełącznika, aby bezpośredniofind
zawęzić wyszukiwanie do urządzenia, na którym inicjujesz wyszukiwanie.Przykład
Powiedzmy, że mam automatyczne
/home
katalogowanie katalogu za pośrednictwem udziałów NFS z mojego serwera NAS, którego nazwa to mulder.Zauważ, że punkt podłączenia jest nadal uważany za lokalny dla systemu.
Teraz kiedy inicjuję
find
:Nie znaleziono,
/home
ale żadna z automatycznie zamontowanych treści, ponieważ są one na innym urządzeniu!Typy systemów plików
Możesz użyć przełącznika do
find
,-fstype
aby kontrolować, jakiego rodzaju systemy plikówfind
będą sprawdzane.Przykład
Jaki mam system plików?
Możesz więc użyć tego do kontrolowania przejścia:
tylko ext3
tylko nfs
ext3 i ext4
źródło
/
jest pełne, a masz podłączone sieciowe systemy plików, nie chcesz nurkować w sieciowych systemach plików.-fstype
celufind
.-xtype
wyklucza systemy plików, wygląda na typ pliku. Znajduję tylko takie przykłady:find . \( -fstype nfs -prune \)
find
przekraczania granic systemu plików. W jego byłej. wspomina: „Jeśli / jest pełny, a masz podłączone sieciowe systemy plików, nie chcesz nurkować w sieciowych systemach plików”.Polecenie znajdowania użytego i-węzła:
źródło
Aby wyświetlić szczegółowe informacje na temat użycia i-węzła
/
, użyj następującego polecenia:źródło
Zdecydowanie odpowiedź przy maksymalnej liczbie głosów pozytywnych pomaga zrozumieć pojęcie i-węzłów w Linuksie i Uniksie, jednak tak naprawdę nie pomaga, jeśli chodzi o rozwiązanie problemu usuwania lub usuwania i-węzłów z dysku. Prostszym sposobem na to w systemach opartych na Ubuntu jest usunięcie niechcianych nagłówków i obrazów jądra Linuxa.
Zrobiłbym to dla ciebie. W moim przypadku użycie i-węzłów wyniosło 78%, z powodu czego otrzymałem alert.
Po uruchomieniu
sudo apt-get autoremove
polecenia spadł do 29%To tylko moja obserwacja pozwoliła mi zaoszczędzić czas. Ludzie mogą znaleźć jakieś lepsze rozwiązanie niż to.
źródło
Uważam, że szybsze i łatwiejsze jest drążenie w dół za pomocą następującego polecenia:
Możesz
var
na przykład przejść do i zobaczyć, jaki jest duży i-węzeł za pomocą katalogów.źródło
Każda dotychczasowa odpowiedź zakłada, że problem dotyczy wielu plików w jednym katalogu, zamiast wielu podkatalogów przyczyniających się do problemu. Na szczęście rozwiązaniem jest po prostu użycie mniejszej liczby flag.
Lub z krótszymi opcji:
du --inodes -x | sort -n
. Niestety nie wszystkie wersjedu
mają opcję i-węzłów.źródło