Comando find de Linux: muestra el progreso

24

Me preguntaba si hay alguna forma de mostrar algún tipo de información de progreso al buscar archivos en Linux usando find. A menudo me encuentro buscando archivos en un disco grande y algún tipo de indicador de progreso sería muy útil, como una barra o al menos el directorio actual "busca" búsquedas. ¿Hay algún script que haga eso o findadmita algunos ganchos? ?

Vlad Balmos
fuente
Gracias por las respuestas, comprobaré todas las soluciones y decidí cuál es mejor. Si fuera por mí, marcaría todas las respuestas como aceptadas.
Vlad Balmos
dependiendo de los criterios de búsqueda que utilice, localizar es mucho más rápido que buscar
B14D3

Respuestas:

28

con este truco puedes ver la carpeta actual, pero no la barra de progreso, lo siento.

 watch readlink -f /proc/$(pidof find)/cwd
ThorstenS
fuente
Eso es genial. Debe tenerse en cuenta que necesita privilegios de superusuario para acceder a cwd. ¡Gracias!
Vlad Balmos
Funciona perfectamente.
Jesse Glick
8

Una pequeña utilidad llamada pv (pipe viewer) puede ayudar. Del fantástico resumen de Peteris Krumins:

El visor de tuberías es una herramienta basada en terminales para monitorear el progreso de los datos a través de una tubería.

Puedes usar pv de varias maneras. Cuando juego por aquí, lo pongo inmediatamente después de una tubería para monitorear el progreso de la salida generada por find (debe pasar stdin a stdout sin tocar)

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

que mostrará la salida un poco como esto:

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

(Redirigí stdout a / dev / null para poder ver la barra de progreso en acción sin que la salida vuele. Probablemente esta no sea tu intención con find, por lo que debes adaptarla en consecuencia)

Sinceramente, no estoy seguro de qué tan bien funciona esto en la naturaleza. Para hallazgos "caros" como el de arriba (atravesando desde la raíz), parecía funcionar bastante bien. Para comandos más simples en un nodo más profundo en el árbol de directorios, pv falló miserablemente. Estos comandos devuelven resultados de inmediato, por lo que una barra de progreso probablemente sea discutible aquí.

En cualquier caso, juegue y vea si esto funciona para lo que necesita. Alimento para el pensamiento, al menos.

tcdyl
fuente
¿Qué mostraría esa barra de progreso? Ninguno de los dos find, ni pvsaber cuánto tiempo tardará la búsqueda ,, para que no puedan calcular el porcentaje. Todo lo que podemos ver en el pvresultado es el tiempo transcurrido desde que se inició la búsqueda.
minaev
Esto es correcto. Pensé que estaba ocurriendo algo de magia, en algún lugar, que permitía que pv verificara el progreso del recorrido del directorio (lo cual es incorrecto). Dada la entrada estándar a una velocidad constante, pv simplemente mueve la barra de progreso a una frecuencia constante. Trate yes | pv > /dev/nullde observar
tcdyl
1
+1 para una buena utilidad
Vlad Balmos
Juzgar el progreso no es trivial. Ni siquiera los navegadores web que cargan páginas pueden hacerlo. Supongo que el contenido del archivo se puede dividir por el tamaño del archivo, pero para las transmisiones de Unix no se conoce la cantidad total de datos, y esta herramienta está destinada a ser flexible para cualquier tipo de datos de transmisión, no solo archivos.
Sridhar Sarnobat
7

Busqué esto hoy y llegué aquí a través de Google. Tuve un hallazgo de larga duración ejecutándose en OS X y aparentemente, watchno existe allí. Así que aquí hay otra solución:

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

  • lsof = lista de archivos abiertos
  • -Fn= solo muestra el nombre del archivo / directorio (prefijado con el carácter 'n', omítelo si prefieres la lsofsalida completa
  • -a= indicar lsofque solo se muestren líneas que coincidan con todos los criterios (de forma predeterminada, se muestran líneas que coinciden con cualquier criterio)
  • -c find= mostrar archivos / directorios abiertos por el proceso llamado find(en realidad, el proceso cuyo nombre comienza con find, pero distingue entre mayúsculas y minúsculas, por Finderlo que no aparecerá)
  • -d cwd = mostrar líneas con FD (filedescriptor) cwd (directorio de trabajo actual)
  • +r 10 = mostrar salida cada 10 segundos hasta que no se encuentren archivos abiertos (la búsqueda ha finalizado)

Esto mostrará que el directorio se findestá procesando cada 10 segundos, por lo que debería dar una idea de si findaún funciona y hasta qué punto ha progresado.

Marie Fischer
fuente
5

Hay un ejemplo de búsquedas paralelas con findin man find. Utilizándolo, puede realizar múltiples comprobaciones para cada elemento, realizando múltiples acciones dependiendo de qué condición funcione. La primera verificación puede ser, por ejemplo, simple -print, por lo que todos los nombres se imprimen en stdout. La segunda verificación hará lo que quieras. Algo como:

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

Si la segunda comprobación también muestra nombres de archivos, puede redirigir uno de ellos a stderr usando -fprint /dev/stderr.

minaev
fuente
No he probado esto, pero creo que es la forma correcta.
Rolf
2

AFAIK, no lo hace, e implementarlo no sería trivial.

... mmm. Quizás un script se ejecute find <target dir> -type dprimero, almacenando la lista y luego haciendo eco de cada directorio antes de ejecutar un find <list item> -maxdepth 1 <rest of find parameters>bucle for.

Tenga en cuenta que está intercambiando una / significativa / pérdida de rendimiento a cambio de poder ver vagamente lo que está haciendo.

Shadur
fuente
1

Esta es una lista de los archivos actuales abiertos por find , por lo que es lo mismo que find está buscando 'en este momento'.

Es liviano como solo la dirección de consulta de las descripciones de archivo utilizadas por find cada segundo y no interfiere en la búsqueda . También puedes hacerlo con cualquier programa que desees.

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

El grep -v /dev/objetivo es ocultar archivos STDOUT, STDIN y STDERR, que son archivos utilizados para recibir e imprimir datos en su consola.

Gabriel Saraiva
fuente