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:
- Se desconoce la extensión del archivo
- Se desconoce el nombre exacto (es decir, letras en mayúscula, números, etc.)
- la ubicación del archivo es desconocida
Comentarios
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 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
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].*"
Book1
, y está en un directorio que puede leer, luegofind / -iname book1
lo encontrará. ¿Está seguro de que en realidad esBook1
y noBook1.xyz
?find
ylocate
.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 enls
. Probablemente te refieres ainame '*book1*'
. Tenga en cuenta que el patrón debe estar entre comillas para evitar que el shell lo expanda antes de quefind
lo vea. También observe quefind
, como muchos comandos * nix, es frustrantemente silencioso cuando no tiene éxito.