Comando find di Linux: mostra i progressi


24

Mi chiedevo se c'è un modo per visualizzare qualche tipo di informazione sui progressi durante la ricerca di file in Linux usando find. Mi trovo spesso a cercare file su un grande disco e un qualche tipo di indicatore di progresso sarebbe molto utile, come una barra o almeno la directory corrente in cui "cerca" cerca. Ci sono degli script che lo fanno o findsupportano alcuni hook ?


grazie per le risposte, controllerò tutte le soluzioni e deciderò quale è meglio. Se dipendesse da me, contrassegnerei tutte le risposte come accettate.
Vlad Balmos,

a seconda di quali criteri di ricerca stai usando individuare è molto più veloce di trovare
B14D3

Risposte:


28

con questo trucco puoi vedere la cartella corrente - ma nessuna barra di avanzamento - scusa.

 watch readlink -f /proc/$(pidof find)/cwd

questo è figo. Va notato che hai bisogno dei privilegi di superutente per accedere a CWD. Grazie!
Vlad Balmos,

Funziona perfettamente.
Jesse Glick,

8

Una piccola utility chiamata pv (pipe viewer) può aiutare. Dal fantastico riassunto di Peteris Krumins:

Pipe viewer è uno strumento basato su terminali per monitorare l'avanzamento dei dati attraverso una pipeline.

Puoi usare PV in diversi modi. Quando gioco qui, l'ho messo subito dopo una pipe per monitorare l'avanzamento dell'output generato da find (dovrebbe passare stdin a stdout intatto)

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

che mostrerà un output un po 'come questo:

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

(Ho reindirizzato stdout a / dev / null in modo da poter vedere la barra di avanzamento in azione senza che l'output volasse. Questo probabilmente non è il tuo intento con find, quindi adatta di conseguenza)

Onestamente non sono sicuro di quanto funzioni bene in natura. Per i reperti "costosi" come quello sopra (attraversando dalla radice), sembrava funzionare abbastanza bene. Per comandi più semplici in un nodo più profondo nella struttura di directory, pv fallito miseramente. Questi comandi stanno restituendo immediatamente i risultati, quindi una barra di avanzamento è probabilmente discutibile qui.

In ogni caso, gioca e vedi se funziona per quello che ti serve. Cibo per la riflessione, almeno.


Cosa mostrerebbe quella barra di avanzamento? Né find, né pvsapere quanto tempo impiegherà la ricerca, quindi non possono calcolare la percentuale. Tutto ciò che possiamo vedere pvnell'output è il tempo trascorso dall'inizio della ricerca.
minaev,

Questo è corretto. Avevo pensato che ci fosse un po 'di magia in atto, da qualche parte, che permetteva a pv di controllare l'avanzamento del traversal della directory (che non è corretto). Dato input standard a una velocità costante, pv sposta semplicemente la barra di avanzamento a una frequenza costante. Prova yes | pv > /dev/nullad osservare
tcdyl il

1
+1 per una bella utility
Vlad Balmos,

Giudicare i progressi non è banale. Nemmeno i browser Web che caricano le pagine sono in grado di farlo. Suppongo che per il contenuto dei file si possa dividere per la dimensione del file, ma per i flussi Unix non si conosce la quantità totale di dati di solito, e questo strumento è pensato per essere flessibile per qualsiasi tipo di dati di flusso, non solo per i file.
Sridhar Sarnobat,

7

Ho cercato questo oggi e sono arrivato qui tramite Google. Ho avuto una scoperta di lunga durata in esecuzione su OS X e apparentemente, watchnon esiste lì. Quindi ecco un'altra soluzione:

lsof -Fn -a -c find -d cwd +r 10

  • lsof = elenco di file aperti
  • -Fn= mostra solo il nome del file / directory (con il prefisso 'n', salta questo se preferisci l' lsofoutput completo
  • -a= indica lsofdi mostrare solo le linee corrispondenti a tutti i criteri (per impostazione predefinita mostra le linee corrispondenti a tutti i criteri)
  • -c find= mostra file / directory aperti dal processo denominato find(in realtà, processo il cui nome inizia con find, ma fa distinzione tra maiuscole e minuscole, quindi Findernon verrà visualizzato)
  • -d cwd = mostra le righe con FD (filedescriptor) cwd (directory di lavoro corrente)
  • +r 10 = mostra l'output ogni 10 secondi fino a quando non viene trovato alcun file aperto (la ricerca è terminata)

Questo mostrerà che la directory findviene elaborata ogni 10 secondi, quindi dovrebbe dare un'idea se findfunziona ancora e fino a che punto è progredita.


5

C'è un esempio di ricerche parallele con findin man find. Usandolo, è possibile eseguire più controlli per ogni elemento, eseguendo più azioni a seconda della condizione che funziona. Il primo controllo può essere, ad esempio, semplice -print, quindi tutti i nomi vengono stampati su stdout. Il secondo controllo farà quello che vuoi. Qualcosa di simile a:

find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)

Se anche il secondo controllo dovesse mostrare i nomi dei file, puoi reindirizzare uno di essi a stderr usando -fprint /dev/stderr.


Non l'ho provato ma penso che sia il modo giusto.
Rolf

2

AFAIK, non lo è e la sua attuazione non sarebbe banale.

... Hmm. Forse uno script viene eseguito per find <target dir> -type dprimo, memorizzando l'elenco e facendo eco a ciascuna directory prima di eseguire un find <list item> -maxdepth 1 <rest of find parameters>ciclo in in a.

Nota che stai scambiando una / significativa / perdita di performance in cambio della possibilità di vedere vagamente cosa sta facendo.


1

Questo è un elenco dei file correnti aperti da find , quindi è lo stesso di ciò che find sta cercando 'now now'.

È leggero come solo l'indirizzo di query dei descrittori di file utilizzati da find ogni secondo e non interferire nel trovare se stesso. Inoltre puoi farlo con qualsiasi programma desideri.

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

Il grep -v /dev/è quello di nascondere file STDOUT, STDIN e STDERR, che sono file usati per ricevere e stampare i dati sulla tua console.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.