Sí, puedes hacer fácilmente ls
generar un nombre de archivo por línea:
ls -a | cat
Explicación:El comando ls
detecta si la salida es a una terminal o a un archivo o tubería y se ajusta en consecuencia.
Entonces, si canalizas ls -a
a python debería funcionar sin ninguna medida especial.
puedes usar ls -1
ls -l
también hará el trabajo
Usa el -1
opción (tenga en cuenta que este es un dígito "uno", no una letra "L" minúscula), así:
ls -1a
Primero, sin embargo, asegúrese de que su ls
admite -1
. GNU coreutils (instalado en sistemas Linux estándar) y Solaris; pero en caso de duda, utilice man ls
o ls --help
o consultar la documentación. Por ejemplo:
$ man ls
...
-1 list one file per line. Avoid '\n' with -q or -b
Ls está diseñado para el consumo humano y no debe analizar su salida.
En los scripts de shell, hay algunos casos en los que analizar la salida de ls es la forma más sencilla de lograr el efecto deseado. Dado que ls puede manipular caracteres no ASCII y de control en los nombres de archivo, estos casos son un subconjunto de aquellos que no requieren obtener un nombre de archivo de ls
.
En python, no hay absolutamente ninguna razón para invocar ls
. Python tiene todos los ls
La funcionalidad de incorporada. Usa os.listdir
para listar el contenido de un directorio y os.stat
o os
para obtener los metadatos del archivo. Otras funciones en el os
Es probable que los módulos también sean relevantes para su problema.
Si está accediendo a archivos remotos a través de ssh, una forma razonablemente sólida de enumerar los nombres de los archivos es a través de sftp:
echo ls -1 | sftp remote-site:dir
Esto imprime un nombre de archivo por línea y, a diferencia del ls
utilidad, sftp
no altera los caracteres no imprimibles. Aún no podrá enumerar de manera confiable los directorios donde el nombre de un archivo contiene una nueva línea, pero eso rara vez se hace (recuerde esto como un posible problema de seguridad, no como un problema de usabilidad).
En python (tenga en cuenta que los metacaracteres de shell deben ser escapes en remote_dir
):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
Para interacciones más complejas, busque el modo por lotes de sftp en la documentación.
En algunos sistemas (Linux, Mac OS X, quizás algunos otros unices, pero definitivamente no en Windows), un enfoque diferente es montar un sistema de archivos remoto a través de ssh con sshfs y luego trabajar localmente.