Cómo encontrar un archivo desde cualquier directorio

22

Estoy tratando de buscar un archivo llamado Libro1 .

En mi prueba, estoy tratando de buscar el archivo mencionado anteriormente y en esta prueba, no sé dónde se encuentra ese archivo.

Lo intenté find / -iname book1pero no hay salida.

¿Cómo encuentro mi archivo llamado book1 usando la línea de comando si no sé dónde está ubicado el archivo?

EDITAR:

Mi escenario se describe con más detalle a continuación:

  1. La extensión del archivo es desconocida
  2. Se desconoce el nombre exacto (es decir, letras mayúsculas, números, etc.)
  3. La ubicación del archivo es desconocida
Aspire27
fuente
2
Si hay un archivo llamado Book1y está en un directorio que puede leer, find / -iname book1lo encontrará. ¿Estás seguro de que es así Book1y no Book1.xyz?
Fox
El nombre completo del archivo es Book1.gnumeric. ¿Estás diciendo que tengo que especificar el nombre completo del archivo? Por alguna razón, pensé, para este comando específico, que todo lo que necesito es el nombre general del archivo. Mi prueba está tratando de encontrar un archivo si, por ejemplo, no recuerdo la extensión del archivo y solo sé el nombre del archivo que estoy buscando. Por favor avise.
Aspire27
@don_crissti Hecho. Por favor vea arriba Editar.
Aspire27
Estás mezclando find y locate. locatees generoso y encontrará todo lo que coincida, siempre que esté en su base de datos, que normalmente se actualiza a diario. find, en este caso, está buscando un archivo glob, el tipo de patrón que usaría ls. Probablemente te refieres iname '*book1*'. Tenga en cuenta que el patrón debe estar entre comillas para evitar que el shell lo expanda antes de findpoder verlo. Observe también que find, como muchos comandos * nix, es frustrantemente silencioso cuando no tiene éxito.
Manngo

Respuestas:

31

Primero, un argumento para -inamees un patrón de shell . Puede leer más sobre patrones en el manual de Bash . La esencia es que para encontrarfind realmente un archivo, el nombre del archivo debe coincidir con el patrón especificado. Para hacer una coincidencia de cadena que no distinga entre mayúsculas y minúsculas, debe agregar para que se vea así:book1Book1.gnumeric*

find / -iname 'book1*'

o especifique el nombre completo:

find / -iname 'Book1.gnumeric'

En segundo lugar, -inamese hacen findpasar por alto el caso de nombre de archivo por lo que si se especifica -iname book1también podría encontrar Book1, bOok1etc. Si estás seguro de que el archivo que está buscando se llama Book1.gnumeric entonces no utilizar -iname, pero -name, que será más rápido:

find / -name 'Book1.gnumeric'

Tercero, recuerde citar el patrón como se dijo en la otra respuesta .

Y por último, ¿está seguro de que desea buscar el archivo en todas partes en su sistema? Es posible que el archivo que está buscando esté realmente en su $HOMEdirectorio si trabajó en eso o lo descargó de alguna parte. De nuevo, eso puede ser mucho más rápido.

EDITAR :

Me di cuenta de que editaste tu pregunta. Si no conoce el nombre completo del archivo, las mayúsculas y la ubicación, debería usar algo como esto:

find / -iname 'book1*'

También sugiero poner 2>/dev/nullal final de la línea para ocultar todos *permission denied*y otros errores que estarán presentes si invoca findcomo usuario no root:

find / -iname 'book1*' 2>/dev/null

Y si está seguro de que está buscando un solo archivo, y solo hay un único archivo en su sistema que coincide con los criterios que puede indicar findque salga después de encontrar el primer archivo coincidente:

find / -iname 'book1*' -print -quit 2>/dev/null
Arkadiusz Drabczyk
fuente
1
-inameno es portátil
Gert van den Berg
6

Puedes probar el locatecomando. Utiliza una base de datos de nombres de archivos para agilizar la búsqueda.

Para buscar todas las coincidencias de archivos *book1*e ignorar mayúsculas y minúsculas, puede usar

locate -i book1

si quieres buscar archivos que comienzan con la book1que tendrá que hacer lo mismo comodín:

locate -i 'book1*'

Es mucho más rápido que find, pero solo está tan actualizado como la última vez que se actualizó la base de datos.

James K
fuente
5

Si sabe que tiene un archivo llamado book1.something, donde se desconoce la ubicación del archivo, el valor exacto somethingy el patrón de mayúsculas del nombre de archivo:

find / -iname 'book1.*'

Si todo lo que sabe con certeza es que el nombre del archivo contiene la palabra book, puede generar una lista probablemente mucho más grande con

find / -iname '*book*'

El argumento -namees un patrón glob de concha. Desde el directorio en el que se encuentra el archivo, compare:

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

Esto representa el tipo de búsqueda realizada por -name. La -inameopción simplemente permite una versión sin distinción entre mayúsculas y minúsculas.

zorro
fuente
1

POSIXY

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

Reportará el camino de todos los archivos cuyo nombre contenga book1(con cualquier variación del caso, pero sólo teniendo en cuenta los caracteres latinos ASCII bokBOK, no las muchas otras variaciones en Unicode, como 𝗄, 𝚔, 𝘬, , , , y todas sus variaciones con diacríticos ...) en todos los directorios a los que tiene acceso de lectura.

Stéphane Chazelas
fuente
0

Para este tipo de tareas siempre hago: find / -iregex '.*Book1.*'

Esta forma se ocuparía de los 3 puntos de su escenario ( iregexes una expresión racional que no distingue entre mayúsculas y minúsculas, y el patrón con .*ambos lados coincidiría con cualquier carácter antes y después de su patrón fijo de Libro1; esto obviamente podría devolverle más resultados de los necesarios pero está seguro de no perder el archivo)

La principal diferencia: si es posible, ser más restrictiva que simplemente usar /, como tratar solamente /homemás o menos, de lo contrario se desciende en algunos directorios que no son relevantes ( /sys, /dev, etc ...)

Sin embargo, recuerde que se aplican los permisos de Unix: si el archivo está en un directorio para el que el usuario que ejecuta el findcomando no tiene acceso (ejecutar) correctamente, findno podrá encontrarlo allí.

Patrick Mevzek
fuente
iregex no funcionará en lugares como Solaris (no se especificó el sistema operativo) (y posiblemente * BSD), es una extensión GNU y no es parte del estándarfind
Gert van den Berg
0

Silver Searcher es una utilidad muy rápida y práctica para buscar archivos y contenido.

Para resolver su problema, el comando del buscador plateado se vería así ...

ag -g Book1

-g PATTERN Imprimir nombres de archivo que coincidan con PATTERN

qoomon
fuente
0

locate y sus variantes tienden a ser un método rápido.

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

Si localizar no está disponible, puede usar finden su lugar. Tiende a ser mucho más lento, pero también mucho más preciso.

Si tiene una única partición: (ejecute como root si su usuario puede no tener acceso al archivo)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

Si no incluye -xdev findbúsquedas en otras particiones, como /procy /sys, que tienden a inundar su pantalla con errores, especialmente si no es root. (Los errores se pueden ocultar agregando 2> /dev/nullal final del comando de búsqueda (el comentario debe eliminarse))

Si tiene varias particiones y no sabe en cuál está el archivo, puede obtener una lista con lsblk(en sistemas operativos basados ​​en Linux, la dfsalida de análisis es una opción de lo contrario) y alimentar eso en find: (rootear nuevamente si no sé si puedes acceder al archivo)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

(Esto es un poco frágil si alguno de sus puntos de montaje tiene espacios) (los dfparámetros pueden necesitar ajuste. -P hace que GNU dfproporcione la salida POSIX estándar. Otras versiones pueden tener otros parámetros o necesitarlos. Lea su página de manual)

El grep -Fexcluye otras cosas devueltas, como particiones de intercambio.

En la versión que no es GNU, awk busca dispositivos con un montaje que comience /devpara obtener sistemas de archivos reales y luego imprima el último campo (el punto de montaje) desde la dfsalida.

Esto también supone un shell tipo bourne ( kshy bashdebería funcionar. Si está utilizando una cshvariante, inicie un shell con script antes de intentarlo)

Gert van den Berg
fuente
El greps puede ser un poco ruidoso, aprenda cómo filtrarlo mejor (esto no debería ser necesario con el ejemplo, pero si se busca algo más común, los greps necesitarían ajustes para mantener bajos los niveles de ruido)
Gert van den Berg
0

ag (el buscador plateado) proporciona una búsqueda muy rápida en archivos, y también tiene una opción para buscar el nombre de archivo:

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

Entonces, en mi caso de uso aquí, es> 30 veces más rápido si el archivo no es un archivo ignorado por ag.

Tomtt
fuente