Pregunta Comando de búsqueda de Linux - muestra el progreso


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 lo haga o lo hace? find apoyar algunos ganchos?


21
2017-12-15 08:16


origen


Gracias por las respuestas, revisaré todas las soluciones y decidiré cuál es mejor. Si dependiera de mí, marcaría todas las respuestas como aceptadas. - Vlad Balmos
Dependiendo de los criterios de búsqueda que estés utilizando, localizar es mucho más rápido que encontrar - B14D3


Respuestas:


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

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

28
2017-12-15 08:48



Eso es genial. Debe tener en cuenta que necesita privilegios de superusuario para acceder a cwd. ¡Gracias! - Vlad Balmos
Funciona perfectamente. - Jesse Glick


Una pequeña utilidad llamada pv (visor de tubos) mayo ayuda. Desde el resumen fantástico por 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. Al jugar por aquí, lo puse inmediatamente después de una tubería para monitorear el progreso de la salida generada por find (debería pasar stdin a stdout intacto)

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

que mostrará la salida un poco como esto:

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

(Redirigí la salida estándar a / dev / null para que pudiera ver la barra de progreso en acción sin que saliera la salida. Es probable que esta no sea su intención con la búsqueda, por lo tanto, adapte en consecuencia)

Sinceramente, no estoy seguro de lo bien que funciona esto en la naturaleza. Para hallazgos "caros" como el de arriba (atravesar desde la raíz), parece funcionar bastante bien. Para comandos más simples en un nodo más profundo en el árbol de directorios, pv falló miserablemente. Estos comandos están devolviendo resultados inmediatamente, por lo que probablemente una barra de progreso sea discutible aquí.

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


7
2017-12-15 09:54



¿Qué mostraría esa barra de progreso? Ninguno find, ni pv saber cuánto durará la búsqueda, por lo que no pueden calcular el porcentaje. Todo lo que podemos ver en el pv La salida es el tiempo desde que se inició la búsqueda. - minaev
Esto es correcto. Pensé que había algo de magia en algún lugar que permitía a pv verificar 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. Tratar yes | pv > /dev/null para observar - tcdyl
+1 por una buena utilidad - Vlad Balmos
Juzgar el progreso no es trivial. Ni siquiera los navegadores web que cargan páginas pueden hacer eso. Supongo que para el contenido del archivo, puede dividirlo por el tamaño del archivo, pero para las transmisiones de Unix no se sabe 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


Busqué esto hoy y llegué aquí a través de Google. Tuve un hallazgo de larga duración en OS X y al parecer, watch no 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 prefiere el nombre completo) lsof salida
  • -a = decir lsof para mostrar sólo líneas coincidentes todos criterios (por defecto muestra líneas coincidentes alguna criterios)
  • -c find = Mostrar archivos / directorios abiertos por el proceso nombrado find (En realidad, el proceso cuyo nombre comienza con find, pero es sensible a mayúsculas por lo Finder no aparecerá)
  • -d cwd = mostrar líneas con FD (filedescriptor) cwd (directorio de trabajo actual)
  • +r 10 = muestra la salida cada 10 segundos hasta que no se encuentran archivos abiertos (la búsqueda está terminada)

Esto le mostrará el directorio. find está procesando cada 10 segundos, por lo que debería dar una idea si find sigue funcionando y hasta qué punto ha progresado.


5
2018-02-01 16:50





Hay un ejemplo de búsquedas paralelas con find en man find. Usándolo, puede realizar múltiples comprobaciones para cada elemento, realizando múltiples acciones dependiendo de qué condición funcione. El primer control puede ser, por ejemplo, simple.-print, por lo que todos los nombres se imprimen a stdout. El segundo cheque hará lo que quieras. Algo como:

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

Si la segunda comprobación también debe mostrar los nombres de archivo, puede redirigir uno de ellos a stderr usando -fprint /dev/stderr.


4
2017-12-15 09:47





AFAIK, no lo hace, y su implementación no sería trivial.

... Hmm. Tal vez un script en ejecución find <target dir> -type d primero, guardando la lista y luego haciendo eco en cada directorio antes de ejecutar un find <list item> -maxdepth 1 <rest of find parameters> en un bucle for.

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


2
2017-12-15 08:24





Esta es una lista de los archivos actuales abiertos por encontrar, asi que es lo mismo de lo que encontrar está mirando 'ahora mismo'.

Es liviano como una simple dirección de consulta de los archivos descriptivos utilizados por encontrar  cada segundo y no interferir en encontrar sí mismo. 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/'

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


1
2018-03-21 02:21