Una búsqueda con locate
encuentra rutas en el sistema de archivos.
A menudo, usted sabe a priori que está interesado en archivos o directorios solamente.
Una búsqueda 'localizar' a menudo devuelve muchos resultados. Sería útil incluir solo uno de los tipos en el resultado, ya que ayuda a acortar la salida.
Pero hay un argumento más interesante para omitir archivos o directorios: porque la lista de rutas de resultados puede ser ambigua, no solo en teoría.
El siguiente ejemplo es un caso del mundo real, y no es inusual:
$ locate --regex --basename "xfce4-keyboard-overlay$"
/usr/local/bin/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay
Ok, encontramos algo! Pero ... ¿archivos o directorios?
$ file /usr/local/bin/xfce4-keyboard-overlay
/usr/local/bin/xfce4-keyboard-overlay: bash script
Entonces ese es un archivo ...
$ file /usr/local/share/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay: directory
mientras que el segundo no lo es.
Esta ambigüedad está haciendo que las largas listas de rutas sean difíciles de leer, por lo que sería realmente bueno filtrar los directorios, por ejemplo, usando una opción de línea de comando para locate
.
Existe algo como esto? ¿Incluso si el filtro para directorios está separado de localizar?
Al menos, uno podría usar un script para iterar todos los nombres de archivo para verificar, lo que puede ser lento.
while
declaración?printf
para datos arbitrarios .locate
y aumentar suread
como se sugiere aquí transnum.blogspot.ie/2008/11/…fuente
/usr/local/share/xfce4-keyboard-overlay
y todos sus subdirectorios , en su ejemplo. Agregar-maxdepth 0
ayuda.locate --regex --basename "xfce4-keyboard-overlay$" | xargs -I % sh -c "test -d % && echo %"
xargs
confind
fue una buena idea, lo he editado para que sea robusto. Espero que no te importe.xargs
repetirá el comando para cada línea si especifica-L 1
o-i
parámetro.Mira aquí
Es cierto que está pateando un nuevo shell para cada archivo, pero tiene la ventaja de ser agradable y compacto.
EDITAR: No estaba muy contento con esa respuesta porque estaba pateando un nuevo shell para cada archivo. Esto solo debe tener dos procesos:
Por supuesto, sería bueno si pudiéramos evitar la patada de un intérprete por completo, pero
xargs
parece tener dificultades para encadenar comandos.fuente
/home/evil/$(reboot)/xfce4-keyboard-overlay
y lo ejecuté tontamente comoroot
).Mis dos centavos:
Esta es más o menos la forma en que G-Man lo hizo combinado con la sustitución del proceso.
fuente
¿Qué pasa si combinas
locate
confile
ygrep
? ...fuente
file
para cada ruta. Tenga en cuenta que a menudo hay muchas líneas de resultados para localizar. Mi prueba actual está buscando "gnome", dando alrededor de 73000 rutas para probar.$f
archivo, elfile
programa abrirá ese archivo y leerá de él . Esto es extremadamente costoso cuando todo lo que necesita hacer es astat()
. ... ... ... ... Además, esto dará resultados incorrectos para los archivos que contienen "directorio" en sus nombres (como "directorio_de_teléfono"). ... ... ... ... ... (Además, lafor f in `…`; do …
sintaxis no puede manejar nombres que contengan espacios.)