comando para buscar archivos buscando solo parte de sus nombres?

32

Digamos que hay archivos con nombres:

batman.c
debate.c
cricketbat.c

¿Qué comando y cómo debo usarlo para enumerar todos estos archivos usando la etiqueta de búsqueda bat?

srk_cb
fuente
55
¿Desea enumerar los archivos coincidentes solo en el directorio actual? en cualquier directorio en o debajo del directorio actual? en cualquier parte del sistema?
steeldriver

Respuestas:

47

Encontrar archivos con batcualquier lugar

Para encontrar todos los archivos en cualquier lugar dentro de /path/to/foldercuyos nombres contengan bat, puede usar:

find /path/to/folder -name '*bat*'

He citado el patrón de búsqueda *bat*, ya que, si se omiten las comillas y los archivos coinciden *bat*en el directorio actual, la cáscara se expandirá *bat*en una lista de ellos y pasar que a find. Entonces findno funcionaría bien. ( \*bat\*y "*bat*"también trabajo)

Para buscar en la carpeta en la que se encuentra actualmente (por ejemplo, en la que ha cdeditado), use ., como de costumbre:

find . -name '*bat*'

Para buscar en toda su computadora, use/ . Para buscar en su directorio de inicio, use ~o el nombre completo de su directorio de inicio. ( El shell se expande~ a la ruta completa de su directorio de inicio).

Ampliar o reducir su búsqueda, según el nombre

Si desea buscar sin distinción entre mayúsculas y minúsculas, para que los archivos que contienen BAT, bAtetc., coincidan, use la -inameprueba en lugar de la -nameprueba:

find /path/to/folder -iname '*bat*'

He notado que todos tus archivos terminan en .c. Si solo desea encontrar archivos como ese, use:

find /path/to/folder -name '*bat*.c'

Noté que todos sus nombres de archivo tienen batya sea al principio o al final de la parte que precede al .csufijo. Si desea evitar la coincidencia de archivos como embattled.c, puede usar:

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oes el operador o .

Solo archivos coincidentes

Para buscar solo archivos normales, y no carpetas, enlaces simbólicos y nodos de dispositivos especiales, puede usarlos -type f. Esto se recomienda con frecuencia y, a veces, es bastante apropiado ... pero a menudo no es lo que realmente desea , especialmente si está ejecutando findcon el fin de examinar la salida usted mismo. Si tuviera un enlace simbólico que coincidiera con su búsqueda, ¿no le gustaría saberlo?

Si desea encontrar archivos regulares y enlaces simbólicos, puede usar:

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

Eso usa el -ooperador y también paréntesis para la agrupación (que debe citarse para que el shell no los trate especialmente; de ​​lo contrario, obtendrá un error de sintaxis).

Pero suponga que solo desea ver enlaces simbólicos que finalmente apuntan a un archivo normal (y no enlaces simbólicos a directorios, nodos de dispositivos, etc.). En realidad, eso es aún más simple: usar en -xtypelugar de -type. Siempre que no se esté ejecutando findcon una -Lmarca, -xtypeen un enlace simbólico se prueba el tipo de archivo al que apunta el enlace.

find /path/to/folder -name '*bat*' -xtype f

Si tiene un enlace simbólico a otro enlace simbólico a un archivo, -xtype flo emparejará aunque su objetivo directo sea ​​otro enlace simbólico en lugar de un archivo normal. Esto es casi siempre lo que quieres.

A menudo las personas piensan que quieren -type f, pero realmente quieren -xtype f.

Obteniendo salida detallada

findLa acción predeterminada de si no especifica una es -print. Todos los comandos dados anteriormente son equivalentes a sí mismos con -printtachuelas al final.

finda menudo se usa para ejecutar comandos basados ​​en los archivos encontrados, a menudo, comandos que realizan cambios. Pero también hay otras acciones cuyo propósito es mostrar resultados, además -print. De particular interés es -ls:

find /path/to/folder -name '*bat*' -ls

Esto proporciona información detallada sobre cada archivo, en un formato de varias columnas, similar (aunque no exactamente igual) a lo que vería al ejecutar .ls file

Otras lecturas

Para obtener más información findy otras formas de buscar archivos, consulte:

Eliah Kagan
fuente
1
Gran respuesta, especialmente el -xtypeconsejo; quizás ls *bat*y -maxdepth/ mindepthtambién valen la pena mencionar.
mklement0
2
@ mklement0 ¡Gracias! El OP aún no ha proporcionado aclaraciones sobre dónde están los archivos y si se necesita o no recurrencia. Como la respuesta del caosls ya cubría , me concentré en el caso recursivo findaquí. Por supuesto, una respuesta detallada que abarque una lista no recursiva (o menos) de nombres de archivos que coincidan con algún patrón ( lsy findcon -maxdepth) también sería útil. Es posible que desee publicar una respuesta!
Eliah Kagan
16

La forma más fácil es correr

locate bat

De esta manera, puede buscar en toda la computadora archivos que contengan "bat" en el nombre del archivo

Para actualizar la lista de archivos en su PC, ejecute

updatedb

Ejecute este comando cuando haya agregado recientemente nuevos archivos a su cuenta

Mark Kirby
fuente
1
necesidadesupdatetdb
Sergiy Kolodyazhnyy
44
@Serg Para buscar nuevos archivos (más nuevos que la última vez que updatedbse ejecutó la última vez de forma manual o automática), sudo updatedbprimero debería ejecutarse, sí.
Eliah Kagan
Tenga en cuenta que esto buscará en todo el sistema nombres coincidentes bat.
terdon
1
@terdon Ya dije esto en la respuesta, no creo que merezca el voto negativo cuando ya dije esto.
Mark Kirby
1
Tenga en cuenta que esto es mucho más rápido de lo find /que locatelas búsquedas de una base de datos, mientras que findlas listas de forma recursiva /y luego coincide con la expresión regular.
Timothy Gu
14

Abra el terminal y cambie los directorios al directorio desde el que desea comenzar a buscar y luego ejecute este comando:

find . -name "*bat*" -type f 

El .inicia el comando de búsqueda desde el directorio actual.
El -namecoincide con la cadena baty distingue entre mayúsculas y minúsculas. ( -inameEs sensible a mayúsculas)
Las -type fbúsquedas de archivos únicos.

karel
fuente
eliminar y recuperar? ok +1: P;)
AB
6

Si los archivos están en el directorio actual, use:

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

O (para tenerlos línea por línea):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

Si desea buscar esos archivos en el sistema, use:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c
caos
fuente
1
Si su búsqueda comienza con el directorio raíz, es posible que desee agregar sudo, ya que este comando informará 'Permiso denegado' para algunas carpetas
Sergiy Kolodyazhnyy
4

Desea utilizar el findcomando, con la -inameopción de coincidencia de nombre de archivo sin distinción entre mayúsculas y minúsculas, o la -nameopción de coincidencia de nombre de archivo con mayúsculas y minúsculas. Ambos le permitirán usar nombres comodín. Entonces, para encontrar cualquier nombre de archivo que contenga "bat" usaría:

find / -iname '*bat*'

O

find / -name '*bat*'

Los *medios "cualquier carácter (s)", por lo que la búsqueda está buscando batcon cualquier carácter, incluyendo ninguno, antes o después de ella. Las /búsquedas desde el directorio raíz de forma recursiva, puede utilizar .lo que buscará recursivamente desde el directorio actual, o la ruta absoluta desde donde desea buscar. Eche un vistazo a cómo buscar archivos usando expresiones regulares en el script de shell de Linux

AJefferiss
fuente
@EliahKagan gracias, he agregado más información a mi respuesta.
AJefferiss
+1 Gracias por la edición. OMI es una fortaleza de esta respuesta que evita recomendar el uso indiscriminado de -type f, que hace más que simplemente excluir directorios y, a menudo, no es lo que los usuarios realmente quieren .
Eliah Kagan
2

Usa lo bueno de siempre find.

find <path_for_search> -type f -iname "*bat*" 

p.ej.:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

de man find:

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
AB
fuente