files – Excluir directorios en la búsqueda de localización

Pregunta:

Una búsqueda con locate encuentra rutas en el sistema de archivos.
A menudo, sabe a priori que está interesado solo en archivos o solo en directorios.
Una búsqueda de 'localización' a menudo arroja 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

¡Bien, encontramos algo! Pero … ¿archivos o directorios?

$ file /usr/local/bin/xfce4-keyboard-overlay 
/usr/local/bin/xfce4-keyboard-overlay:   bash script

Entonces eso 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 hace que las listas largas de rutas sean difíciles de leer, por lo que sería muy 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 de directorios es independiente de localizar?

Al menos, se podría usar un script para iterar todos los nombres de archivo para verificar, lo que puede ser lento.

Respuesta:

Con zsh :

print -rC1 ${(0)^"$(locate -0 ...)"}(N.)

(0) es una bandera de expansión de parámetros que se divide en caracteres NUL (como usamos locate -0 ), abreviatura de (ps:\0:) .

Con ^ , en lugar de agregar (N.) al final de la matriz, lo agregamos a cada elemento.

(N.) es un calificador glob, . para hacer coincidir solo archivos normales, N para eliminar el elemento si no coincide (no existe o no es un archivo normal, o no podemos verificar). También puede usar ^/ lugar de . para hacer coincidir no directorios en lugar de solo archivos normales. O -. para determinar el tipo de archivo después de la resolución del enlace simbólico (incluya enlaces simbólicos a archivos normales en la coincidencia).

print -rC1 imprime cada argumento sin procesar en 1 C olumn (lo mismo que -l para escribir uno por línea, excepto en el caso de que no haya nada para imprimir, en cuyo caso print -C1 no genera nada mientras que print -l imprime una línea vacía).

Puede usar cualquier calificador glob de zsh , pero tenga en cuenta que los que ordenan no tendrán ningún efecto, ya que estamos expandiendo un glob por archivo aquí, por lo que solo hay un archivo para ordenar para cada uno.

Para identificar mejor qué archivos son ejecutables / directorio / enlace simbólico / socket …, también puede pasar los archivos resultantes como argumentos a ls -F para agregar algunos */@= … sufijos

Aquí, asumiendo herramientas GNU y un shell similar a Bourne:

elocate() {
  locate -0e "$@" |
    sort -z |
    xargs -r0 ls --quoting-style=shell --color=always -Fd1U |
    less -FIXR
}

elocate una función elocate que da una versión coloreada y paginada de locate con nombres de archivo citados en estilo shell para evitar ambigüedades, y con sufijos agregados para dar indicaciones de tipo.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım