Cómo encontrar un archivo en cualquier directorio

Estoy tratando de buscar un archivo llamado Book1 .

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

Intenté find / -iname book1 pero no hay salida.

¿Cómo encuentro mi archivo llamado book1 usando la línea de comando si no lo sé? ¿Dónde se encuentra el archivo?

EDITAR:

Se describe mi escenario con más detalle a continuación:

  1. Se desconoce la extensión del archivo
  2. Se desconoce el nombre exacto (es decir, letras en mayúscula, números, etc.)
  3. la ubicación del archivo es desconocida

Comentarios

  • Si hay un archivo llamado Book1, y está en un directorio que puede leer, luego find / -iname book1 lo encontrará. ¿Está seguro de que en realidad es Book1 y no Book1.xyz?
  • El nombre completo del archivo es Libro1. 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 ‘ no recuerdo la extensión del archivo y solo sé el nombre del archivo que ‘ estoy buscando. Por favor avise.
  • @don_crissti Hecho. Consulte Editar arriba.
  • Está mezclando find y locate. locate es generoso y encontrará cualquier cosa que coincida, siempre que esté en su base de datos, que normalmente se actualiza a diario. find, en este caso, está buscando un archivo global, el tipo de patrón que usaría en ls. Probablemente te refieres a iname '*book1*'. Tenga en cuenta que el patrón debe estar entre comillas para evitar que el shell lo expanda antes de que find lo vea. También observe que find, como muchos comandos * nix, es frustrantemente silencioso cuando no tiene éxito.

Responder

Primero, un argumento para -iname es un patrón de shell. Puedes leer más sobre patrones en el manual de Bash . La esencia es que para que find realmente encuentre un archivo, el nombre del archivo debe coincidir con el patrón especificado. Para hacer que una cadena que no distinga entre mayúsculas y minúsculas book1 coincida con Book1.gnumeric, debe agregar * para tiene este aspecto:

find / -iname "book1*" 

o especifique el nombre completo:

find / -iname "Book1.gnumeric" 

Segundo , -iname hará que find ignore las mayúsculas y minúsculas del nombre de archivo, por lo que si especifica -iname book1 también podría busque Book1, bOok1, etc. Si «está seguro de que el archivo que» está buscando se llama Book1.gnumeric entonces no use -iname pero -name, será más rápido:

find / -name "Book1.gnumeric" 

En tercer lugar, recuerde citar el patrón como se dice en la otra respuesta .

Y por último, son ¿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 algún lugar. Nuevamente, eso puede ser mucho más rápido.

EDIT :

Me di cuenta que editó su 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 que ponga 2>/dev/null al final de la línea para ocultar todos los *permission denied* y otros errores que estarán presentes si invoca find como un usuario no root:

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

Y si «está seguro» de que está buscando un solo archivo, y solo hay un archivo en su sistema que coincida 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 

Comentarios

Respuesta

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

Para buscar todos los archivos que coincidan con *book1* e ignorando las mayúsculas y minúsculas, puede utilizar

locate -i book1 

si desea buscar archivos que comiencen con book1, deberá utilizar el comodín usted mismo:

locate -i "book1*" 

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

Comentarios

  • Ninguno de estos produjo ningún resultado para mí: locate -i after.sh, sudo locate -i "after.sh", sudo locate -i after.sh, sudo locate -i '*after.sh'

Respuesta

Si sabe que tiene un archivo llamado book1.something, donde se encuentra la ubicación del archivo, el valor exacto de something , y el patrón de uso de mayúsculas del nombre del archivo son todos desconocidos:

find / -iname "book1.*" 

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

find / -iname "*book*" 

El argumento para -name es un patrón glob 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 que no distingue entre mayúsculas y minúsculas.

Responder

POSIXly,

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

Informará la ruta de todos los archivos cuyo nombre contenga book1 (con cualquier variación de mayúsculas y minúsculas , pero solo teniendo en cuenta los caracteres latinos ASCII 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.

Respuesta

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

ls -a /**/book1 

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

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

Consulte manual .

Respuesta

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

Este formulario 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 seguramente no se perderá el archivo)

La principal diferencia: si es posible, sea más restrictivo que solo usar /, como probar solo /home más o menos, de lo contrario descenderás en algunos directorios que no son relevantes (/sys, /dev, etc.)

Sin embargo, recuerda que Unix permissi Se aplican las siguientes opciones: si el archivo está en un directorio para el que el usuario que ejecuta el comando find no tiene derecho de acceso (ejecución), find no poder encontrarlo allí.

Comentarios

  • iregex ganó ‘ t trabajar en lugares como Solaris (no se especificó el sistema operativo) (y posiblemente * BSD), es una extensión GNU y no forma parte del estándar find

Respuesta

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

Para resolver su problema, el comando del buscador de plata se vería así …

ag -g Book1

-g PATTERN Imprimir nombres de archivos que coincidan con el PATRÓN

Respuesta

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 ubica no está disponible etiqueta, puede utilizar find en su lugar. Suele ser mucho más lento, pero también mucho más preciso.

Si tiene una sola partición: (ejecute como root si su usuario no tiene 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 find busca cosas en otras particiones, como /proc y /sys, que tienden a inundar tu pantalla con errores, especialmente si no eres 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 » Si no sabe en cuál está el archivo, puede obtener una lista con lsblk (en sistemas operativos basados en Linux, el análisis df es una opción en caso contrario) e introduzca eso en find: (root de nuevo 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 en) (df los parámetros pueden necesitar un ajuste. -P hace que GNU df dé salida POSIX estándar. Otro las versiones pueden tener otros parámetros o es necesario omitirlo. Lea su página de manual)

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

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

Esto también asume un shell similar a bourne (ksh y bash debería funcionar. Si está utilizando una csh variante, inicie un scriptable shell antes de intentar esto)

Comentarios

  • Los grep s pueden ser un poco ruidosos, aprender a filtrar mejor (esto no debería ser necesario con el ejemplo, pero si es algo más común que se busca, los greps necesitaría un ajuste para mantener bajos los niveles de ruido)

Responder

ag (el buscador de plata) 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.

Respuesta

find / -type f -iname "book[0-9].*" 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *