¿Cómo envío un nombre de fichero por línea de salida en Linux?
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
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.