Pregunta

Estoy usando comandos ls -a para obtener los nombres de archivo en un directorio, pero la salida es en una sola línea.

De esta manera:

.  ..  .bash_history  .ssh  updater_error_log.txt

Necesito un built-in alternativo para obtener los nombres de archivos, cada uno en una nueva línea, así:

.  
..  
.bash_history  
.ssh  
updater_error_log.txt
¿Fue útil?

Solución

Utilice la opción -1 (tenga en cuenta que este es un dígito "uno", no una letra minúscula "L"), así:

ls -1a

En primer lugar, sin embargo, asegúrese de que su apoyo ls -1. GNU coreutils (instalados en los sistemas Linux estándar) y Solaris hacen; pero en caso de duda, el uso man ls o ls --help o compruebe la documentación. Por ejemplo:.

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b

Otros consejos

Sí, usted puede hacer fácilmente de salida ls un nombre de fichero por línea:

ls -a | cat

Explicación:. Los sentidos de comandos ls Si la salida es a un terminal o en un archivo o tubo y se ajusta en consecuencia

Por lo tanto, si la tubería ls -a a pitón que debería funcionar sin ningún tipo de medidas especiales.

Ls está diseñado para el consumo humano, y no se debe analizar su salida.

En los scripts de shell, hay algunos casos en los que el análisis de la salida de ls ¿El trabajo es la forma más sencilla de lograr el efecto deseado. Desde ls podrían mangle no ASCII y caracteres de control en los nombres de archivo, estos casos son un subconjunto de aquellas que no requieren la obtención de un nombre de archivo de ls.

En Python, no hay absolutamente ninguna razón para ls de invocación. Python tiene toda la funcionalidad de ls incorporado. Uso os.listdir para listar el contenido de un directorio y os.stat o os para obtener metadatos del archivo. Otras funciones en el os módulos es probable que sean relevantes para su problema también.


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 un nombre de archivo por línea, ya diferencia de la utilidad ls, sftp hace caracteres no imprimibles no mangle. Todavía no será capaz de listar directorios de forma fiable en un nombre de archivo contiene un salto de línea, pero que rara vez ha hecho (recuerda que esto como un problema de seguridad potencial, no un problema de usabilidad).

En pitón (cuidado que los metacaracteres de shell debe 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 las interacciones más complejas, buscar el modo por lotes de SFTP en la documentación.

En algunos sistemas (Linux, Mac OS X, tal vez algunos otros Unices, pero definitivamente no es Windows), un enfoque diferente es montar un sistema de archivos remoto a través de ssh con sshfs , y luego trabajar a nivel local.

Puede utilizar ls -1

ls -l también lo hará el trabajo

fácil, siempre y cuando los nombres de archivo no incluyen saltos de línea:

find . -maxdepth 1

Si está tuberías de esto en otro comando, se debe probablemente preferiría para separar los nombres de archivo de bytes nulos, en lugar de saltos de línea, ya bytes nulos no pueden ocurrir en un nombre de archivo (pero nuevas líneas de mayo):

find . -maxdepth 1 -print0

impresión de que en un terminal probablemente aparecerá como una línea, porque bytes nulos no se imprimen normalmente. Algunos programas pueden necesitar una opción específica a la manija de entrada nula delimitado, como sort de -z. Su propio script de manera similar tendría que dar cuenta de esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top