Zastanawiałem się, czy jest jakiś sposób, aby wyświetlić jakieś informacje o postępie podczas wyszukiwania plików w systemie Linux find
. Często szukam plików na dużym dysku i jakiś wskaźnik postępu byłby bardzo pomocny, np. Pasek lub przynajmniej wyszukiwanie w katalogu „znajdź” w bieżącym katalogu. Czy są jakieś skrypty, które to robią lub find
obsługują niektóre zaczepienia ?
24
Odpowiedzi:
dzięki tej sztuczce możesz zobaczyć bieżący folder - ale bez paska postępu - przepraszam.
źródło
Pomocne może być małe narzędzie o nazwie pv (przeglądarka potoków) . Z fantastycznego streszczenia Peterisa Kruminsa:
Przeglądarka potoków jest narzędziem terminalowym do monitorowania postępów danych w potoku.
Możesz użyć pv na wiele sposobów. Podczas zabawy tutaj, umieszczam go natychmiast po potoku, aby monitorować postęp produkcji generowanej przez find (powinien przekazać stdin na stdout nietknięty)
który wyświetli dane wyjściowe trochę tak:
(Przekierowałem stdout na / dev / null, abym mógł zobaczyć pasek postępu w akcji bez przelatującego wyjścia. Prawdopodobnie nie jest to twój zamiar znalezienia, więc dostosuj odpowiednio)
Naprawdę nie jestem pewien, jak dobrze to działa na wolności. Wydaje się, że w przypadku „drogich” znalezisk podobnych do powyższego (przechodzenie od roota) działa całkiem dobrze. W przypadku prostszych poleceń w głębszym węźle drzewa katalogów pv nie powiodło się. Te polecenia natychmiast zwracają wyniki, więc pasek postępu prawdopodobnie jest tutaj dyskusyjny.
W każdym razie baw się i sprawdź, czy to w ogóle działa na to, czego potrzebujesz. Przynajmniej jedzenie do namysłu.
źródło
find
niepv
wiadomo, jak długo potrwa wyszukiwanie, więc nie mogą obliczyć procentu. Napv
wyjściu widać jedynie czas, od którego wyszukiwanie zostało rozpoczęte.yes | pv > /dev/null
obserwowaćSzukałem tego dzisiaj i dotarłem tutaj przez Google. Miałem długo działające znalezisko działające na OS X i najwyraźniej
watch
tam nie istnieje. Oto kolejne rozwiązanie:lsof -Fn -a -c find -d cwd +r 10
lsof
= lista otwartych plików-Fn
= po prostu pokaż nazwę pliku / katalogu (z prefiksem „n”, pomiń to, jeśli wolisz pełnelsof
wyjście-a
= powiedz,lsof
aby wyświetlać tylko wiersze spełniające wszystkie kryteria (domyślnie pokazuje wiersze spełniające dowolne kryteria)-c find
= pokaż pliki / katalogi otwarte przez proces o nazwiefind
(właściwie proces, którego nazwa zaczyna się odfind
, ale rozróżnia małe i duże litery, więcFinder
się nie pokaże)-d cwd
= pokaż linie za pomocą FD (filedescriptor) cwd (bieżący katalog roboczy)+r 10
= pokaż dane wyjściowe co 10 sekund, dopóki nie zostaną znalezione żadne otwarte pliki (wyszukiwanie jest zakończone)To pokaże, że katalog
find
przetwarza co 10 sekund, więc powinien dać pomysł, czyfind
nadal działa i jak daleko się posunął.źródło
Istnieje przykład równoległych wyszukiwań z
find
inman find
. Korzystając z niego, możesz wykonać wiele kontroli dla każdego elementu, wykonując wiele akcji w zależności od tego, który warunek działa. Pierwsza kontrola może być na przykład prosta-print
, więc wszystkie nazwy są drukowane na standardowe wyjście. Druga kontrola zrobi, co chcesz. Coś jak:find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)
Jeśli podczas drugiego sprawdzania powinny być również wyświetlane nazwy plików, możesz przekierować jeden z nich do stderr za pomocą
-fprint /dev/stderr
.źródło
AFAIK, tak nie jest, a wdrożenie go byłoby niepraktyczne.
... Hmm. Być może
find <target dir> -type d
najpierw uruchomiony skrypt , przechowujący listę, a następnie echo każdego katalogu przed uruchomieniemfind <list item> -maxdepth 1 <rest of find parameters>
pętli for.Pamiętaj, że handlujesz / znacząco / utratą wydajności w zamian za to, że możesz niejasno zobaczyć, co robi.
źródło
To jest lista bieżących plików otwieranych przez find , więc jest to to samo, co find szuka „teraz”.
Jest lekki jak adres zapytania o deskryptory plików używane przez find co sekundę i nie przeszkadza w znajdowaniu się. Możesz to również zrobić z dowolnym programem.
Ma
grep -v /dev/
to na celu ukrycie plików STDOUT, STDIN i STDERR, które są plikami używanymi do odbierania i drukowania danych na konsoli.źródło