Usando localizar para encontrar un directorio


20

Utilizo localizar todo el tiempo para buscar archivos de los que conozco el nombre, localizar es muy rápido y eso me encanta. Para los archivos creados recientemente, encontrar es excelente, normalmente con archivos creados recientemente, sé dónde se crearon básicamente, así que no tengo que buscar en todo mi sistema de archivos.

Sin embargo, cuando he olvidado la ubicación de un directorio, ni buscar ni localizar parecen ideales.

Localizar siempre escupe demasiada información porque cada archivo dentro de un directorio también es una coincidencia para localizar. Por ejemplo, si estaba buscando un directorio llamado registro en algún lugar de mi sistema de archivos, el registro de localización arrojaría toneladas y toneladas de resultados. Si hago lo mismo con find, find / -name log -type d find tarda unos minutos en ejecutarse y escupe todo tipo de errores de permisos cada vez que encuentra una carpeta que no puede leer.

¿Hay una mejor manera?

Respuesta: Así que me quedo con grep hasta que encuentre algo más:

locatedir () {
    for last; do true; done
    if [[ $last == *\/* ]]
    then
        locate $@ | grep "${last}\$"
    else
        locate $@ | grep "/${last}\$"
    fi
}

Respuestas:


12

Una forma (sospecho que puede haber una mejor manera) es usar grep para devolver solo las rutas que terminan en el nombre de su carpeta:

locate foldername | grep /foldername$

28

Puede usar la opción --regex( -r) de locate:

locate -r '/log$'

Sí (+1) locatetiene su propia capacidad de expresión regular incorporada: -ro --regex... para una gama completa de opciones, ver: información localizar
Peter

1
¡Sabía que debía haber una mejor manera!
misterben

Tan corto y funciona sin problemas. Gran contribución! Otra razón para aprender / dominar las expresiones regulares
loved.by.Jesus

No necesitas los dos 'en este caso: locate -r /log$es suficiente.
simlev

5

Has probado:

locate /home/insertusernamehere/*/filename?

o

locate file | grep -i '^/home/.*/examplesubdirectory'?

o alguna variación de tales?


Esta respuesta muestra que grepno es necesario, y como se ve en la primera opción sugerida, tampoco lo son las expresiones regulares.
Tom

2

Aquí está

locatedir () {
    locate "$*" | while read line
    do 
    if [ -d "$line" ] ; then echo $line ; fi
    done
}

locatedir $*

1
Si puede explicar qué cambios ha realizado, también será útil para otros.
Ron
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.