Estoy intentando encontrar todos los archivos de proyecto de un tipo de archivo en particular con:
ls -ltR *.mb
Sé que hay los archivos que quiero en varias carpetas, pero no obtengo resultados. ¿Qué hice mal?
Respuesta1
ls
no coincide con los patrones. Simplemente enumera los archivos o carpetas en los argumentos de entrada. *.mb
es expandido por el caparazónantespasando a ls
, por lo tanto, si no hay archivos nombrados *.mb
en el directorio actual, no se generará nada; de lo contrario, solo se generarán los archivos en el directorio actual
La forma estándar de enumerar archivos de forma recursiva es utilizarfind
find . -name '*.mb' -type f -printf "%-.22T+ %M %n %-8u %-8g %8s %Tx %.8TX %p\n" | sort | cut -f 2- -d ' '
De esta manera puede personalizar el formato de la lista de salida como desee. Ver:Listar archivos por fecha de última edición
Una forma alternativa es utilizarglobstar
que se puede habilitar conshopt -s globstar
ls -ltR **/*.mb
El primero **/
coincidirá con cualquier ruta de subdirectorio arbitraria. Luego *.mb
haga coincidir sus archivos en esos directorios
estrella globular
Si se establece, el patrón
**
utilizado en un contexto de expansión de nombre de archivo coincidirá con todos los archivos y con cero o más directorios y subdirectorios. Si el patrón va seguido de/
, solo coinciden los directorios y subdirectorios.https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html
Respuesta2
@phuclv tiene dos buenas opciones. Cuando necesito hacer algo similar, normalmente canalizo la salida de ls a grep de esta manera:
ls -ltR | grep .*\.mb
esto envía la salida de ls a la entrada de grep en lugar de enviarla a stdout, y luego grep genera solo las líneas que contienen al menos una coincidencia para la expresión regular.
La expresión regular
.*\.mb
se puede explicar como:
.: match any character
*: preceding character or group should appear 0 or more times
\.mb: literally .mb