Ls está diseñado para el consumo humano, y you should not parse its output.
En los scripts de shell, hay algunos casos en los que el análisis de la salida de ls funciona es la forma más sencilla de lograr el efecto deseado. Dado que ls puede manipular caracteres no ASCII y controlar caracteres en nombres de archivos, estos casos son un subconjunto de aquellos que no requieren obtener un nombre de archivo del ls
.
En python, no hay absolutamente ninguna razón para invocar ls
. Python tiene toda la funcionalidad de ls
incorporada. Use os.listdir
para listar el contenido de un directorio y os.stat
o os
para obtener los metadatos del archivo. Es probable que otras funciones en los módulos os
también sean relevantes para su problema.
Si accede a archivos remotos a través de SSH, una forma razonablemente robusta de la inclusión de los nombres de archivos es a través de SFTP:
echo ls -1 | sftp remote-site:dir
Esto imprime nombre de un archivo por línea, ya diferencia de la utilidad ls
, sftp
no destruye los caracteres no imprimibles. Todavía no podrá listar de manera confiable los directorios donde el nombre de un archivo contiene una línea nueva, pero eso rara vez se hace (recuerde esto como un posible problema de seguridad, no como un problema de usabilidad).
en Python (ten en cuenta que metacaracteres de shell deben ser escapa en remote_dir
):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
Para las interacciones más complejas, buscar el modo por lotes de SFTP en la documentación.
En algunos sistemas (Linux, Mac OS X, quizás algunos otros equipos, 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.
ls tiene como objetivo mostrar una lista para el consumo humano. Si está utilizando ls para cualquier otro propósito (como, por ejemplo, obtener una lista de archivos en un script para repetir), seguramente está utilizando la herramienta incorrecta. – Juliano
@juliano - Debe ser consumido por un script python en realidad. ¿Por qué lo llamas una herramienta incorrecta? – fixxxer
@fixxer En el momento en que canaliza 'ls' a python,' ls' generará un archivo por línea como expliqué en mi respuesta. –