Me gustaría escribir algo como esto:
$ ls **.py
para obtener todos los nombres de archivo .py, recorriendo recursivamente una jerarquía de directorios.
Incluso si hay archivos .py para encontrar, el shell (bash) da este resultado:
ls: cannot access **.py: No such file or directory
¿Alguna forma de hacer lo que quiero?
EDITAR: Me gustaría especificar que no estoy interesado en el caso específico de ls
, pero la pregunta es sobre la sintaxis global.
nullglob
nullglob
, recomiendo leer las siguientes advertencias .wc -l {**,.}/*.py
funciona bien** no hace más que un solo *, ambos operan en el directorio actual
fuente
find
si no tiene bash 4. Ejemplos:yourcommand `find . -name '*.py'`
(tenga en cuenta los backticks);find . -name '*.py' -exec yourcommand {} \;
.Desde Bash 4 (que también incluye zsh) se ha agregado una nueva opción global (
globstar
) que trata el patrón de manera**
diferente cuando se configura.Está haciendo coincidir el patrón comodín y devolviendo los nombres de archivo y directorio que coinciden reemplazando el patrón comodín en el comando con los elementos coincidentes.
Normalmente, cuando lo usa
**
, funciona de manera similar*
, pero recurre a todos los directorios de forma recursiva (como un bucle).Para ver si está habilitado, verifíquelo mediante
shopt globstar
(en scripting, useshopt -q globstar
).El ejemplo
**.py
funcionaría solo para el directorio actual, ya que no devuelve una lista de directorios que pueden ser recurrentes, por lo que es necesario usar comodines de nivel de directorio múltiple**/*.py
, para que pueda profundizar.Busque en SO pocas pruebas de sintaxis que hice para encontrar todos los archivos de forma recursiva.
fuente