¿Cómo puedo encontrar recursivamente todos los archivos en la actual y subcarpetas en función de la coincidencia de comodines?

1889

¿Cómo puedo encontrar recursivamente todos los archivos en la actual y subcarpetas en función de la coincidencia de comodines?

Juan
fuente

Respuestas:

2742

Use find para eso:

find . -name "foo*"

findnecesita un punto de partida, y el .(punto) apunta al directorio actual.

tux21b
fuente
21
Sé que esto está etiquetado como Linux, pero vale la pena mencionarlo: la ruta es necesaria para otras variantes * nix que no son Linux. En Linux, la ruta es opcional si desea utilizar punto.
IslandCow
44
@Seatter "foo *" le dice a find que busque todos los archivos que comienzan con "foo". Es solo su ejemplo. Puede usar "gpio *" para encontrar todos los archivos cuyos nombres comienzan con gpio, o simplemente "gpio1" para encontrar todos los archivos llamados gpio1.
schumacher574
29
tenga en cuenta que el "foo *" está entre comillas para que el shell no lo expanda antes de pasarlo a buscar. si lo hiciera find . foo*, foo*se expandiría Y LUEGO pasaría a buscar.
grinch
33
Vale la pena destacar que " "es muy necesario para la búsqueda recursiva.
WesternGun
3
También es útil: si no desea recibir notificaciones sobre directorios para los que no tiene permiso (u otros errores), puede hacerlofind . -name "foo*" 2>/dev/null
Jobbo
222

La búsqueda de tuberías en grep suele ser más conveniente; le da todo el poder de las expresiones regulares para la coincidencia arbitraria de comodines.

Por ejemplo, para buscar todos los archivos con una cadena "foo" que no distingue mayúsculas de minúsculas en el nombre del archivo:

~$ find . -print | grep -i foo
Paul Whipp
fuente
58
findTambién tiene las -iname, -regexy -iregexbanderas para mayúsculas y minúsculas comodín, expresiones regulares, y sensible a las mayúsculas coincidencia de expresión regular, por lo que las tuberías a grepes innecesario.
iobender
77
No creo que se trate de ser innecesario, sino de ser más conveniente.
Elijah Lynn
1
Sin embargo, canalizar a grep -v puede permitirle usar cadenas simples o expresiones regulares para eliminar las entradas que no desea.
door_number_three
3
@iobender - Lamentablemente, puedo decirle por experiencia que no todos los sistemas vienen con un findcomando que admite esas opciones. A veces se grepconvierte en la única opción.
Sr. Llama
150

find encontrará todos los archivos que coinciden con un patrón:

find . -name "*foo"

Sin embargo, si quieres una foto:

tree -P "*foo"

¡Espero que esto ayude!

IslandCow
fuente
18
brew install treepara usuarios de Mac OSX sin apt-getinstalar
DeBraid
1
Probado en macOS Sierra, solo agregue '--print' -> 'find. nombre "* foo" --print '. superuser.com/questions/177289/searching-mac-through-terminal
john-salib
2
sudo yum install tree -y para CentOS
Santosh Kumar Arjunan
39
find -L . -name "foo*"

En algunos casos, he necesitado el parámetro -L para manejar enlaces de directorios simbólicos. Por defecto, los enlaces simbólicos se ignoran. En esos casos, era bastante confuso ya que cambiaría el directorio a un subdirectorio y vería el archivo que coincidía con el patrón, pero find no devolvería el nombre del archivo. El uso de -L resuelve ese problema. Las opciones de enlace simbólico para buscar son -P -L -H

toddcscar
fuente
1
El interruptor L es muy útil. Muchas veces los usuarios no tienen idea de los directorios subyacentes, ya sea que estén vinculados por software o sean directorios normales. Entonces, en caso de duda, siempre es bueno usar la opción L. Al menos, siempre me ha ayudado.
Ritesh
2
Esa fue la respuesta para mí. ¡Gracias!
iedmrc
34

Si su shell admite una nueva opción global (puede habilitarse mediante :)shopt -s globstar , puede usar:

echo **/*foo*

para buscar archivos o carpetas de forma recursiva. Esto es compatible con Bash 4, zsh y shells similares.


Personalmente tengo esta función de shell definida:

f() { find . -name "*$1*"; }

Nota: La línea anterior se puede pegar directamente en el shell o agregarse al ~/.bashrcarchivo de su usuario .

Entonces puedo buscar cualquier archivo escribiendo:

f some_name

Alternativamente, puede usar una fdutilidad con una sintaxis simple, por ejemplo fd pattern.

kenorb
fuente
1
Esto solo entra en un solo nivel. No recurro a los subdirectorios para mí
Broncha
3
@Broncha Porque necesitas activar el globbing extendido por shopt -s globstarcomando. Esto es compatible con Bash, zsh y shells similares.
kenorb
bash-3.2$ shopt -s globstardabash: shopt: globstar: invalid shell option name
2017
@drewish Necesitas actualizar tu Bash a 4.x
kenorb
echo * / * foo es menos rápido que encontrar
Josef Klimuk
32

fd

En caso de que findsea ​​demasiado lento, pruebe con la fdutilidad, una alternativa simple y rápida a la findescrita en Rust.

Sintaxis:

fd PATTERN

Manifestación:

Página de inicio: https://github.com/sharkdp/fd

kenorb
fuente
17
Primera vez que veo un gif en SO en casi 9 años. ¡Buen trabajo!
Joshua Pinter
1
Esos resultados de rendimiento parecen muy prometedores. Podría considerar agregar fd a la
elaboración
fuera del tema: ¿qué herramienta usaste para crear el archivo svg para la demostración?
Aprodan
2
@aprodan La imagen de demostración se copió de GitHub, pero creo que están usando asciinema, luego se convirtió al formato GIF, pero no estoy seguro.
kenorb
1
En realidad es el formato SVG, por lo que probablemente asciicast2vectorse pueda usar.
kenorb
27
find <directory_path>  -type f -name "<wildcard-match>"

En el comodín puede proporcionar la cadena que desea que coincida, por ejemplo, * .c (para todos los archivos c)

XYZ_Linux
fuente
1
Su respuesta es la primera más correcta aquí, ya que solo busca archivos como se especifica. Los otros que no especifiquen el tipo devolverán los directorios.
wilsotc
si desea buscar un directorio "-type f" podría cambiarse a "-type d"
XYZ_Linux
11

Puedes usar:

# find . -type f  -name 'text_for_search'

Si quieres usar REGX usa -iname

# find . -type f  -iname 'text_for_search'
usuario8848899
fuente
9

El siguiente comando enumerará todos los archivos que tengan el nombre exacto "patrón" (por ejemplo) en la actual y sus subcarpetas.

find ./ -name "pattern"

anshul
fuente
8

La forma predeterminada de buscar archivos recursivos, y disponible en la mayoría de los casos es

find . -name "filepattern"

Comienza el desplazamiento recursivo para el nombre de archivo o patrón desde el directorio actual en el que está ubicado. Con el comando find, puede usar comodines y varios modificadores, para ver la lista completa de opciones, escriba

man find

o si las páginas man no están disponibles en su sistema

find --help

Sin embargo, hay herramientas más modernas y más rápidas que las que se encuentran, que atraviesan todo su sistema de archivos e indexan sus archivos, una de esas herramientas comunes es localizar o descifrar / ubicar, debe consultar el manual de su sistema operativo sobre cómo instalarlo, y una vez que esté instalado necesita iniciar la base de datos, si el script de instalación no lo hace por usted, puede hacerlo manualmente escribiendo

sudo updatedb

Y, usarlo para buscar algún tipo de archivo en particular

locate filename

O, para buscar el nombre de archivo o el patrón desde el directorio actual, puede escribir:

 pwd | xargs -n 1 -I {} locate "filepattern"

Examinará su base de datos de archivos e imprimirá rápidamente los nombres de ruta que coinciden con el patrón que ha escrito. Para ver la lista completa de las opciones de localizar, escriba: locate --help oman locate

Además, puede configurar localizar para actualizar su base de datos en horas programadas a través del trabajo cron, por lo que muestra cron qué actualizaciones db a la 1 AM se vería así:

0 1 * * * updatedb

Estos trabajos cron deben ser configurados por root, ya que updatedb necesita privilegios de root para atravesar todo el sistema de archivos.

Aleksandar Pavić
fuente
7

para búsqueda de archivos
find / -xdev -name settings.xml -> computadora completa
find ./ -xdev -name settings.xml -> directorio actual y su subdirectorio

para archivos con tipo de extensión

find . -type f -name "*.iso"
Alberto
fuente
6

Me sorprende ver que localizar no se usa mucho cuando vamos de forma recursiva.

Primero haría una búsqueda de "$ PWD" para obtener la lista de archivos en la carpeta de interés actual, y luego ejecutaría greps en ellos como quisiera.

locate "$PWD" | grep -P <pattern>

Por supuesto, esto supone que la actualizaciónb se realiza y el índice se actualiza periódicamente. Esta es una forma mucho más rápida de encontrar archivos que ejecutar un hallazgo y pedirle que baje del árbol. Mencionando esto para completar. Nada en contra de usar find, si el árbol no es muy pesado.

Melchi
fuente
locate "$PWD*.mp4" Sólo para recordar que usted puede ser capaz de saltar elgrep
Jefferey cueva
5

El siguiente comando ayuda a buscar cualquier archivo

1) Independientemente del caso
2) Resultado Excluir carpetas sin permiso
3) Buscar desde la raíz o desde la ruta que desee. Cambiar / con la ruta que prefieras.

Sintaxis:
find -iname '' 2> & 1 | grep -v "Permiso denegado"

Ejemplo

find / -iname 'C * .xml' 2> & 1 | grep -v "Permiso denegado"

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"
MukeshKoshyM
fuente
1
¿Por qué demonios usas grep para eso? Solo redirige stderr a nulofind / -iname '*C*.xml' 2>/dev/null
phuclv
3

Si desea buscar un archivo especial con comodín, puede usar el siguiente código:

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

Supongamos que desea buscar todos los archivos .conf desde aquí:

.significa búsqueda iniciada desde aquí (lugar actual)
-typesignifica tipo de elemento de búsqueda que aquí es el archivo (f).
-namesignifica que desea buscar archivos con nombres * .conf .

Reza Harasani
fuente
3

Esto buscará todos los archivos relacionados en los directorios actuales y secundarios, calculando su recuento de líneas por separado y totalmente:

find . -name "*.wanted" | xargs wc -l
Jay Yang
fuente
2

Utilizar

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Explicación

  1. El primer parámetro es el directorio que desea buscar.
  2. Por defecto findhace recursividad.
  3. Los -osoportes para -or. Entonces, arriba significa buscar este comodín O este. Si solo tiene un patrón, entonces no necesita-o .
  4. Las comillas alrededor del patrón comodín son obligatorias.
Shital Shah
fuente