Nie oczekuj, że to zadziała szybko ...
cd do katalogu, w którym podejrzewasz, że może istnieć podkatalog z dużą ilością i-węzłów. Jeśli ten skrypt zajmuje dużo czasu, prawdopodobnie znalazłeś, gdzie w systemie plików szukać. / var to dobry początek ...
W przeciwnym razie, jeśli przejdziesz do najwyższego katalogu w tym systemie plików i uruchomisz go i zaczekasz na zakończenie, znajdziesz katalog ze wszystkimi i-węzłami.
find . -type d |
while
read line
do
echo "$( find "$line" -maxdepth 1 | wc -l) $line"
done |
sort -rn | less
Nie martwię się o koszty sortowania. Przeprowadziłem test i posortowanie tego nieposortowanego wyjścia w stosunku do 350 000 katalogów zajęło 8 sekund. Pierwsze znalezisko zajęło. Rzeczywistym kosztem jest otwarcie wszystkich tych katalogów w pętli while. (sama pętla zajmuje 22 sekundy). (Dane testowe zostały uruchomione w podkatalogu z 350 000 katalogów, z których jeden miał milion plików, reszta zawierała od 1 do 15 katalogów).
Różni ludzie zauważyli, że ls nie jest w tym świetny, ponieważ sortuje dane wyjściowe. Próbowałem echa, ale to też nie jest świetne. Ktoś inny zauważył, że stat podaje te informacje (liczbę pozycji katalogu), ale nie jest przenośny. Okazuje się, że find -maxdepth jest naprawdę szybki w otwieraniu katalogów i zlicza pliki., Więc ... tutaj są ... punkty dla wszystkich!
Jeśli problemem jest jeden katalog ze zbyt dużą liczbą plików, oto proste rozwiązanie:
Ideą tego
find
wiersza jest to, że rozmiar katalogu jest proporcjonalny do ilości plików bezpośrednio w tym katalogu. Więc szukamy katalogów z mnóstwem plików w środku.Jeśli nie chcesz zgadywać numeru i wolisz wymienić wszystkie podejrzane katalogi uporządkowane według „rozmiaru”, to też jest łatwe:
źródło
Grrr, komentarz wymaga 50 powtórzeń. Ta odpowiedź jest więc komentarzem do odpowiedzi Chris'a.
Ponieważ pytający prawdopodobnie nie przejmuje się wszystkimi katalogami, tylko najgorszymi, użycie sortowania jest prawdopodobnie bardzo kosztowną przesadą.
Nie jest to tak kompletne jak twoja wersja, ale to robi linie wydruku, jeśli są większe niż poprzednie maksimum, znacznie zmniejszając ilość wydrukowanego szumu i oszczędzając koszty tego rodzaju.
Wadą tego jest to, że jeśli masz 2 bardzo duże katalogi, a pierwszy ma o 1 więcej i-węzłów niż drugi, nigdy nie zobaczysz drugiego.
Bardziej kompletnym rozwiązaniem byłoby napisanie mądrzejszego skryptu perlowego, który śledzi 10 najważniejszych wartości i wypisuje je na końcu. Ale to zbyt długo, aby szybko odpowiedzieć na błąd serwera.
Ponadto, nieco bardziej inteligentne skrypty perla pozwoliłyby pominąć pętlę while - na większości platform ls sortuje wyniki, a to może być bardzo kosztowne w przypadku dużych katalogów. Sortowanie ls nie jest tutaj konieczne, ponieważ liczy się tylko liczba.
źródło
Możesz użyć tego małego fragmentu:
Wydrukuje, ile plików i katalogów znajduje się w każdym z katalogów w bieżącym folderze, z największymi przestępcami na dole. Pomoże Ci znaleźć katalogi zawierające wiele plików. ( więcej informacji )
źródło
To nie jest bezpośrednia odpowiedź na twoje pytanie, ale wyszukiwanie ostatnio zmodyfikowanych plików o małym rozmiarze za pomocą find może zawęzić wyszukiwanie:
źródło
ls nie znajdzie pliki, których nazwy zaczynają się od kropki. Używanie find pozwala tego uniknąć. Znajduje każdy plik w drzewie katalogów, odcina nazwę basename od końca każdej ścieżki i zlicza ile razy każda ścieżka katalogu pojawia się w wynikowym wyniku. Może być konieczne wstawienie „!” w cytatach, jeśli twoja skorupa na to narzeka.
I-węzły mogą być również wykorzystywane przez pliki, które zostały usunięte, ale są utrzymywane otwarte przez uruchomiony proces. Jeśli ten pakiet Munin zawiera jakieś stale działające programy, inną rzeczą do sprawdzenia jest to, czy przechowuje on nietypową liczbę plików.
źródło
Brute force to jeden: uruchom tripwire na całym urządzeniu, aby uzyskać linię bazową, a następnie uruchom test jakiś czas później, a katalog przestępców wystanie jak obolały kciuk.
źródło
(brak możliwości komentowania naprawdę się starzeje - dotyczy to egorgry)
egorgry - ls -i drukuje i-węzeł NUMBER dla pozycji, a nie i-COUNT.
Wypróbuj go z plikiem w katalogu - prawdopodobnie zobaczysz równie wysoką liczbę, ale to nie jest liczba i-węzłów, to tylko i-węzeł #, na który wskazuje twój wpis w katalogu.
źródło
Aktualizacja
Jeden linijka, która zwraca liczbę i-węzłów każdego potomka danego katalogu z największymi wpisami na dole.
Oryginalna odpowiedź
Uruchom go w ten sposób (biorąc pod uwagę, że powyższy skrypt znajduje się w pliku wykonywalnym w katalogu roboczym)
źródło
użycie i-węzła wynosi około jednego na plik lub katalog, prawda? Tak też
policzyć w przybliżeniu, ile i-węzłów jest używanych w [ścieżka].
źródło
Próbowałem napisać skuteczny potok powłoki, ale stał się nieporęczny i albo powolny, albo niedokładny, np.
wyświetli katalogi liści (i niektóre inne) zawierające ponad 1000 plików. Oto skrypt Perla, który wykonuje to skutecznie zarówno pod względem czasu, jak i pamięci RAM. Wyjście jest jak
«Pliki w poddrzewie» «pliki bezpośrednio w katalogu» «nazwa katalogu»
dzięki czemu można go łatwo masować i filtrować za pomocą zwykłych narzędzi, np. sortuj (1) lub awk (1) jak wyżej.
źródło
mój dom na moim laptopie używa i-węzłów 131191.
źródło