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 find
admita algunos ganchos? ?
24
Respuestas:
con este truco puedes ver la carpeta actual, pero no la barra de progreso, lo siento.
fuente
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)
que mostrará la salida un poco como esto:
(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.
fuente
find
, nipv
saber cuánto tiempo tardará la búsqueda ,, para que no puedan calcular el porcentaje. Todo lo que podemos ver en elpv
resultado es el tiempo transcurrido desde que se inició la búsqueda.yes | pv > /dev/null
de observarBusqué esto hoy y llegué aquí a través de Google. Tuve un hallazgo de larga duración ejecutándose en OS X y aparentemente,
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 prefieres lalsof
salida completa-a
= indicarlsof
que 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 llamadofind
(en realidad, el proceso cuyo nombre comienza confind
, pero distingue entre mayúsculas y minúsculas, porFinder
lo 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
find
está procesando cada 10 segundos, por lo que debería dar una idea de sifind
aún funciona y hasta qué punto ha progresado.fuente
Hay un ejemplo de búsquedas paralelas con
find
inman 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
.fuente
AFAIK, no lo hace, e implementarlo no sería trivial.
... mmm. Quizás un script se ejecute
find <target dir> -type d
primero, almacenando la lista y luego haciendo eco de cada directorio antes de ejecutar unfind <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.
fuente
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.
El
grep -v /dev/
objetivo es ocultar archivos STDOUT, STDIN y STDERR, que son archivos utilizados para recibir e imprimir datos en su consola.fuente