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
}
Miguel
fuente

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$
misterben
fuente
28

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

locate -r '/log$'
Florian Diesch
fuente
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?

RolandiXor
fuente
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 $*
Linuxuser
fuente
1
Si puede explicar qué cambios ha realizado, también será útil para otros.
Ron