desarrollo-web-br-bd.com

Cómo encontrar un archivo desde cualquier directorio

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 book1 pero 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
25
Aspire27

Primero, un argumento para -iname es un Shell ¡patrón. Puede leer más sobre patrones en Bash manual . Lo esencial es que para que find realmente ¡encontrar un archivo, el nombre del archivo debe coincidir con el patrón especificado. Para hacer una cadena entre mayúsculas y minúsculas book1 partido Book1.gnumeric tienes que agregar * así se ve así:

find / -iname 'book1*'

o especifique el nombre completo:

find / -iname 'Book1.gnumeric'

Segundo, -iname hará que find ignore el caso del nombre de archivo, por lo que si especifica -iname book1 también podría encontrar Book1, bOok1 etc. Si está seguro de que el archivo que está buscando se llama Book1.gnumeric entonces no uses -iname pero -name, será más rápido:

find / -name 'Book1.gnumeric'

Tercero, recuerde citar el patrón como se dice en 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 $HOME directorio 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/null al final de la línea para ocultar todo *permission denied* y otros errores que estarán presentes si invoca find como 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, puede decirle a find que salga después de encontrar el primer archivo coincidente:

find / -iname 'book1*' -print -quit 2>/dev/null
35
Arkadiusz Drabczyk

Puede probar el comando locate. Utiliza una base de datos de nombres de archivos para agilizar la búsqueda.

Para buscar todas las coincidencias de archivos *book1*, e ignorando el caso, podrías usar

locate -i book1

si desea buscar archivos comenzando con book1 necesitará hacer el comodín usted mismo:

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.

6
James K

Si sabe que tiene un archivo llamado book1.something, Donde se desconoce la ubicación del archivo, el valor exacto de something y 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 mucho más grande con

find / -iname '*book*'

El argumento para -name Es un patrón global de Shell. 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 opción -iname Simplemente permite una versión sin distinción entre mayúsculas y minúsculas.

5
Fox

POSIXY

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

Informará la ruta de todos los archivos cuyo nombre contiene book1 (con cualquier variación de mayúsculas y minúsculas, pero solo considerando los caracteres ASCII caracteres latinos bokBOK, no las muchas otras variaciones en Unicode como ????, ????, ????, , , , y todas sus variaciones con signos diacríticos ...) en todos los directorios a los que tiene acceso de lectura.

1

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.

0
tomtt

Silver Searcher es una utilidad muy rápida y útil 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 archivos que coinciden con PATTERN

0
qoomon

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

Esta forma se ocuparía de los 3 puntos de su escenario (iregex es una expresión racional que no distingue entre mayúsculas y minúsculas, y el patrón con .* en 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 que no perderá el archivo)

La principal diferencia: si es posible, sea más restrictivo que simplemente usar /, como probar solo /home más o menos, de lo contrario descenderá 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 comando find no tiene acceso (ejecutar) correctamente, find no podrá encontrarlo allí.

0
Patrick Mevzek

Con Zsh puedes usar patrones globales, así que esto también funciona:

ls -a /**/book1

Esto encontrará todas las ubicaciones donde un archivo llamado book1 vive.

En mis pruebas, esto parece ser más rápido que usar find, y también produce poco o ningún error de permiso de usuario cuando se ejecuta sin root permiso

Ver manual .

0
smac89
find /  -type f -iname "book[0-9].*" 
0
Praveen Kumar BS

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 find en 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 -xdevfind busca cosas en otras particiones, como /proc y /sys, que tienden a inundar su pantalla con errores, especialmente si no es root. (Los errores se pueden ocultar agregando 2> /dev/null al 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, analizar la salida df es una opción de lo contrario ) e ingrese eso en find: (rootee nuevamente si no sabe si puede 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) (df los parámetros pueden necesitar ajuste. -P hace GNU df da salida POSIX estándar) Es posible que otras versiones tengan otros parámetros o que deban omitirse. Lea su página de manual)

Los grep -F excluye otras cosas devueltas, como las particiones de intercambio.

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

Esto también supone que un Shell similar a una fresa (ksh y bash debería funcionar. Si está utilizando una variante csh, inicie un Shell con secuencia de comandos antes de intentar esto)

0