¿Cuál es el equivalente de Linux de DOS "dir / s / b filename"?

17

Lista todos los archivos / directorios en o debajo del directorio actual que coinciden con 'nombre de archivo'.

mackenir
fuente

Respuestas:

28

El equivalente directo es

find . -iname <filename>

que enumerará todos los archivos y directorios llamados <filename>en el directorio actual y cualquier subdirectorio, ignorando mayúsculas y minúsculas.

Si su versión de find no es compatible -iname, puede usarla -nameen su lugar. Tenga en cuenta que -iname, a diferencia , distingue entre -namemayúsculas y minúsculas.

Si solo desea enumerar los archivos llamados <filename>, y no los directorios, agregue-type f

find . -iname <filename> -type f

Si desea utilizar comodines, debe poner comillas alrededor, p. Ej.

find . -iname "*.txt" -type f

de lo contrario, el shell lo expandirá.

Como otros han señalado, también puedes hacer:

find . | grep "\.txt$"

grep imprimirá líneas basadas en expresiones regulares, que son más potentes que los comodines, pero tienen una sintaxis diferente.

Ver man findy man greppara más detalles.

Mikel
fuente
3
Si <filename>contiene comodines, utilice comillas alrededor, p find . -name '*.txt'. Ej .
Gilles 'SO- deja de ser malvado'
@Gilles, actualicé mi respuesta para decir eso, gracias.
Mikel
2
Usar <filename>como marcador para la entrada del usuario es un mal hábito en el entorno de línea de comandos, donde la < and >mayoría de las veces tiene un significado específico. Sugiero simplemente usar filename, tal vez FILENAME para enfatizarlo. La mayoría de las personas lo entenderán, y aquellos que no lo harán, podrían causar daño cuando no comprendan que se supone que no deben alcanzar un signo menor o mayor que.
usuario desconocido
2
<filename>es una convención en mucha documentación de UNIX, por lo que creo que es útil que la gente lo sepa, pero estoy de acuerdo en que FILENAMEpodría ser más fácil de entender.
Mikel
1
find -iname <filename>es mejor ya que no distingue entre mayúsculas y minúsculas como DOS
Agnel Kurian
8

Algunas conchas lo permiten ls **/filename, lo cual es bastante conveniente.

Shawn J. Goff
fuente
1
Buen punto. En versiones recientes de bash, la ejecución shopt -s globstar; echo **/filenamees equivalente afind . -name "filename" . También funciona en zsh.
Mikel
Este 'ls ** / filename` está bien, pero parece que no va más allá de un nivel de directorio.
Sopalajo de Arrierez
@ sopalajo-de-arrierez Si lo hace shopt -s globstar, probablemente funcionará para usted. El globing recursivo es una función que solo está disponible en algunos shells y, a veces, no está activada de forma predeterminada.
Shawn J. Goff el
Ops ... Ahora entiendo, @ ShawnJ.Goff: el shoptcomando habilita la opciónglobstar on . Ahora funciona como un encanto! Muchas gracias.
Sopalajo de Arrierez
4

Puedes hacer esto con

find . | egrep filename
Matten
fuente
1
También podría hacerlo en uno con find . -regextype posix-egrep -regex '.*filename.*'(no sé si la egrepparte es importante, pero usó egrepen su respuesta, así que la incluí)
Michael Mrozek
Puede, pero grep es diferente al comando equivalente de DOS. grepusa expresiones regulares, mientras que el comando DOS usa comodines de shell.
Mikel
1
Ahora que lo pienso, los globos de shell también son diferentes a los comodines de DOS. Por ejemplo, find . -name "*.*"no hará lo que esperarías de un fondo de DOS. Sin embargo, los globos están lo suficientemente cerca como para ser reconocibles, mientras que las expresiones regulares son una bestia completamente nueva.
Jander
¿Qué hace *.*.*en un dos moderno, es decir, Windows cmd? ¿Qué hay de *.*.*.*?
ctrl-alt-delor
0

También puede ser: tree -if </your/path> o 'pwd'como un camino

Michael Fatahov
fuente