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 funciona es la forma más sencilla de lograr el efecto deseado. Dado que ls puede alterar caracteres que no son ASCII y controlar los nombres de los archivos, estos casos son un subconjunto de aquellos que no requieren la obtención de un nombre de archivo ls
.
En python, no hay absolutamente ninguna razón para invocar ls
. Python tiene todas ls
las funciones integradas. Utilícelo os.listdir
para enumerar el contenido de un directorio y / os.stat
o os
para obtener metadatos de archivo. os
Es probable que otras funciones en 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 nombres de 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 de la ls
utilidad, sftp
no destruye los caracteres no imprimibles. Aún no podrá enumerar de manera confiable 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 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 otros unices, pero definitivamente no Windows), un enfoque diferente es montar un sistema de archivos remoto a través de ssh con sshfs , y luego trabajar localmente.