Jak mogę użyć find
do wygenerowania listy katalogów, które zawierają największą liczbę plików. Chciałbym, aby lista była od najwyższej do najniższej. Chciałbym tylko, aby lista sięgała 1 poziomu w głąb i zwykle uruchamiałam to polecenie z góry mojego systemu plików, tj /
.
21
Odpowiedzi:
Za pomocą narzędzi GNU:
To używa dwóch
find
poleceń. Pierwszy znajdzie katalogi i potokuje je dowhile
pętli, a następnie uruchomi kolejne wyszukiwanie dla każdego katalogu. Drugi wyświetla wszystkie pliki / katalogi potomne na pierwszym poziomie, jednocześniegrep
je licząc.grep
Pozwala-print0
być stosowany z drugim znalezisku ponieważwc
nie ma-z
odpowiednika. Zapobiega to dwukrotnemu liczeniu nazw plików z nową linią (chociaż używaniewc
i-print0
nie ma większego znaczenia).Wynik drugiego
find
jest umieszczany w argumencieecho
tak, aby nazwa katalogu mogła być łatwo umieszczona w tym samym wierszu ($(..)
konstrukcja automatycznie przycina nowy wiersz na końcugrep
). Linie są następnie sortowane według liczby, a 50 największych liczb jest pokazanych za pomocąhead
.Zauważ, że obejmie to także katalogi punktów montowania najwyższego poziomu. Prostym sposobem obejścia tego problemu jest użycie podłączenia mount, a następnie skorzystanie z katalogu podłączenia. Aby to zrobić:
Bardziej przenośne rozwiązanie korzysta z innej instancji powłoki dla każdego katalogu (również tutaj odpowiedziano ):
Przykładowe dane wyjściowe:
źródło
AKTUALIZACJA: Zrobiłem to wszystko poniżej, co jest fajne, ale wymyśliłem lepszy sposób sortowania katalogów według użycia i-węzła:
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:
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ą dowiązane. Trochę jak powyższa rzecz. Mogę się jednak mylić - i z zadowoleniem przyjmuję korektę ...Podstawową metodą tego jest to, że zastępuję każdą z
ls
nazw plików zawartymi w niej nazwami katalogów.sed.
Po tym ... Cóż, jestem trochę rozmyty. Jestem całkiem pewien, że dokładnie zlicza pliki, jak widać tutaj: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.
STARY:
Znajduję to szybciej i jest przenośny:
Nie musi tak być w
-exec
przypadku każdego katalogu - używa tylko jednegosh
procesu ell i jednegofind
. Muszę nadal miećset -- $glob
prawo do dołączania.hidden
plików i wszystkiego innego, ale jest bardzo blisko i bardzo szybko. Wystarczycd
sprawdzić w katalogu głównym, aby sprawdzić i rozpocząć.Oto przykład mojego wyjścia z
/usr
:Używam również
sed
u dołu, aby przyciąć go do 50 najlepszych wyników.head
byłoby oczywiście szybsze, ale w razie potrzeby przycinam również każdą linię:Wprawdzie to prymitywne, ale to była myśl. Innym prymitywnym urządzeniem, z którego korzystam, jest zrzutowanie
2>stderr
zarówno do, jakfind
icd
do2>/dev/null
. Jest to po prostu czystsze niż sprawdzanie błędów uprawnień dla katalogów, których nie mogę odczytać bez dostępu do katalogu głównego - być może powinienem to określićfind
. Cóż, to praca w toku.Ok, więc naprawiłem globusy powłoki w ten sposób:
I faktycznie zamiar zadać pytanie, w jaki sposób można to zrobić, ale jak byłem wpisując w tytule zapytania strona wskazała mnie do sugerowanej powiązane pytanie , gdzie lo i oto już Stephane zważono . To było wygodne. Najwyraźniej
[^.],
dobrze obsługiwany, nie jest przenośny i musisz użyć!bang.
I znalazłem to w komentarzu Stephane'a.W każdym razie, oczywiście wciągnięcie ukrytych plików nie wystarczyło. Muszę więc
set
dwa razy, aby uniknąć szukania literału dla pozycji$glob
. Wydaje się jednak, że wcale nie wpływa to na wydajność i niezawodnie dodaje każdy plik w katalogu.źródło
ls -i
i ... chyba ... prawdopodobniegrep
... może - no cóż, używasz,-xdev,
co jest początkiem ...uniq
isort
?du
jakiej wersji korzystasz ? Mójdu
nie ma--inodes
opcji.Dlaczego nie użyć czegoś takiego jak KDirStat Chociaż został pierwotnie napisany dla KDE, ale działa również dobrze z GNOME. Daje najlepszy widok liczby plików / katalogów i odpowiedniego wykorzystania w GUI
źródło