Linux find command - pokaż postęp

24

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 findobsługują niektóre zaczepienia ?

Vlad Balmos
źródło
dzięki za odpowiedzi sprawdzę wszystkie rozwiązania i zdecyduję, które z nich jest lepsze. Gdyby to zależało ode mnie, zaznaczyłbym wszystkie odpowiedzi jako zaakceptowane.
Vlad Balmos,
w zależności od kryteriów wyszukiwania, których używasz, lokalizowanie jest znacznie szybsze niż znajdowanie
B14D3

Odpowiedzi:

28

dzięki tej sztuczce możesz zobaczyć bieżący folder - ale bez paska postępu - przepraszam.

 watch readlink -f /proc/$(pidof find)/cwd
ThorstenS
źródło
to super. Należy zauważyć, że do uzyskania dostępu do cwd potrzebne są uprawnienia administratora. dzięki!
Vlad Balmos,
Działa świetnie.
Jesse Glick,
8

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)

find / -mtime -1h | pv > /dev/null

który wyświetli dane wyjściowe trochę tak:

6.42MB 0:01:25 [31.7kB/s] [         <=>      ]

(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.

tcdyl
źródło
Co pokazałby ten pasek postępu? Ani findnie pvwiadomo, jak długo potrwa wyszukiwanie, więc nie mogą obliczyć procentu. Na pvwyjściu widać jedynie czas, od którego wyszukiwanie zostało rozpoczęte.
minaev,
To jest poprawne. Myślałem, że gdzieś dzieje się jakaś magia, która pozwoliła pv sprawdzić postęp przechodzenia przez katalog (co jest niepoprawne). Biorąc pod uwagę standardowe wejście ze stałą prędkością, pv po prostu przesuwa pasek postępu ze stałą częstotliwością. Spróbuj yes | pv > /dev/nullobserwować
tcdyl
1
+1 za niezłe narzędzie
Vlad Balmos,
Ocenianie postępów nie jest trywialne. Nawet przeglądarki internetowe ładujące strony nie są w stanie tego zrobić. Sądzę, że w przypadku zawartości pliku, którą można podzielić przez rozmiar pliku, ale w przypadku strumieni Unix nie wiesz, że zwykle jest to całkowita ilość danych, a to narzędzie ma być elastyczne dla każdego rodzaju danych strumieniowych, nie tylko plików.
Sridhar Sarnobat
7

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 watchtam 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łne lsofwyjście
  • -a= powiedz, lsofaby 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 nazwie find(właściwie proces, którego nazwa zaczyna się od find, ale rozróżnia małe i duże litery, więc Findersię 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 findprzetwarza co 10 sekund, więc powinien dać pomysł, czy findnadal działa i jak daleko się posunął.

Marie Fischer
źródło
5

Istnieje przykład równoległych wyszukiwań z findin man 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.

minaev
źródło
Nie przetestowałem tego, ale myślę, że to właściwy sposób.
Rolf
2

AFAIK, tak nie jest, a wdrożenie go byłoby niepraktyczne.

... Hmm. Być może find <target dir> -type dnajpierw uruchomiony skrypt , przechowujący listę, a następnie echo każdego katalogu przed uruchomieniem find <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.

Shadur
źródło
1

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.

# watch -n 1 'ls -l /proc/$(pidof find)/fd | cut -d ">" -f 2 | grep -v /dev/'

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.

Gabriel Saraiva
źródło