Estoy usando el ls -a
comando para obtener los nombres de archivo en un directorio, pero la salida está en una sola línea.
Me gusta esto:
. .. .bash_history .ssh updater_error_log.txt
Necesito una alternativa integrada para obtener nombres de archivo, cada uno en una nueva línea, como esta:
.
..
.bash_history
.ssh
updater_error_log.txt
ls
a Python,ls
generará un archivo por línea como lo expliqué en mi respuesta.ls
salidapython
y observado la salida de una sola línea en python?Respuestas:
Use la
-1
opción (tenga en cuenta que este es un "un" dígito, no una letra minúscula "L"), de esta manera:Primero, sin embargo, asegúrese de
ls
contar con su apoyo-1
. GNU coreutils (instalado en sistemas Linux estándar) y Solaris do; pero en caso de duda, utiliceman ls
ols --help
o compruebe la documentación. P.ej:fuente
ls --help
salida ... siempre instalado ;-)linux ls one file per line
y este fue el artículo principal. No puedo creer cuán prolija es la respuesta elegida o que esta respuesta tiene menos votos que la que se dirige al gato.ls -1
ftw.ls
el-1
comportamiento predeterminado es cuando la salida no está conectada al terminal.Sí, puede hacer que la
ls
salida sea un nombre de archivo por línea:Explicación: El comando
ls
detecta si la salida es a un terminal o a un archivo o tubería y se ajusta en consecuencia.Entonces, si se conecta
ls -a
a Python, debería funcionar sin ninguna medida especial.fuente
ls
solo hay una versión-1
.
y..
"archivos" que muestran en la salida, aunque?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 todasls
las funciones integradas. Utilíceloos.listdir
para enumerar el contenido de un directorio y /os.stat
oos
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:
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
):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.
fuente
puedes usar
ls -1
ls -l
también hará el trabajofuente
ls -l
que no se debe utilizar.Fácil, siempre que sus nombres de archivo no incluyan nuevas líneas:
Si está transfiriendo esto a otro comando, probablemente debería preferir separar sus nombres de archivo por bytes nulos, en lugar de líneas nuevas, ya que los bytes nulos no pueden aparecer en un nombre de archivo (pero las líneas nuevas pueden):
Imprimir eso en un terminal probablemente se mostrará como una línea, porque los bytes nulos normalmente no se imprimen. Algunos programas pueden necesitar una opción específica para manejar entradas delimitadas por nulos, como
sort
's-z
. Su propia secuencia de comandos de manera similar tendría que dar cuenta de esto.fuente