Nierzadko muszę liczyć liczbę plików w katalogu, czasem dochodzi do milionów.
Czy istnieje lepszy sposób niż ich liczenie i liczenie find . | wc -l
? Czy istnieje jakieś wywołanie systemu plików, które można wykonać na ext3 / 4, które jest mniej intensywne we / wy?
linux
filesystems
find
ext4
MattPark
źródło
źródło
find -maxdepth 1
. Zauważ, że przy obecnym podejściu policzysz dwukrotnie dowolną nazwę zawierającą znak nowej linii.Odpowiedzi:
Nie podstawowe przyspieszenie, ale przynajmniej coś :)
Naprawdę nie musisz przekazywać listy nazw plików, wystarczy tylko nowy wiersz. Ten wariant jest o około 15% szybszy na moim Ubuntu 12.04.3, gdy katalogi są buforowane w pamięci RAM. Ponadto ten wariant będzie działał poprawnie z nazwami plików zawierającymi znaki nowej linii.
Co ciekawe, ten wariant wydaje się nieco wolniejszy niż powyższy:
Specjalny przypadek - ale naprawdę szybki
Jeśli katalog znajduje się we własnym systemie plików, możesz po prostu policzyć i-węzły:
Jeśli liczba katalogów i plików w innych katalogach niż liczona nie zmienia się bardzo, możesz po prostu odjąć tę znaną liczbę od bieżącego
df -i
wyniku. W ten sposób będziesz mógł bardzo szybko policzyć pliki i katalogi.źródło
time find /usr/src/ -printf \\n | wc -l
, możesz wyczyścićsudo sync && sudo sysctl -w vm.drop_caches=3
-printf x
ma być taki sam jak-printf '\0'
? Nie widzę tego w dokumentach.-printf
działa podobnie doprintf()
funkcji w C z tą różnicą, że%
dyrektywy mają inne znaczenie. Akcja jest wywoływana dla każdego znalezionego pliku. Oznacza to, że-printf x
wypisze znakx
dla każdego znalezionego pliku (wypróbuj!) I-printf '\0'
wypisze znak NULL (kod ASCII 0) dla każdego znalezionego pliku.-printf '\0'
nie ma specjalnego znaczenia. Oba będą działać tak samo w przykładzie zwc -c
tą odpowiedzią.Napisałem ffcnt właśnie w tym celu. Pobiera fizyczne przesunięcie samych katalogów za pomocą
fiemap
ioctl, a następnie planuje przejście katalogu w wielu sekwencyjnych przejściach w celu ograniczenia losowego dostępu. To, czy rzeczywiście uzyskasz przyspieszenie,find | wc
zależy od kilku czynników:fiemap
najbardziej skorzystają systemy plików takie jak ext4, które obsługują ioctl(ponowne) montowanie z,
relatime
a nawetnodiratime
może również poprawić prędkość (dla wszystkich metod), gdy dostęp w przeciwnym razie spowodowałby aktualizację metadanych.źródło
Właściwie to w moim systemie (Arch Linux) to polecenie
jest szybszy niż wszystkie powyższe:
źródło
/bin/ls: Argument list too long
jeśli używasz globowania, ale znowu może działać rekurencyjnie, podobnie jak find, więc może to jest coś do rozważenia, nie używaj find, jeśli nie jest potrzebny.ls -A
wymień tylko pliki w bieżącym katalogu, afind
bez-maxdepth 1
argumentów przeszuka rekursywnie wszystkie podkatalogi.