Ls foi projetado para consumo humano e você não deve analisar sua saída .
Nos scripts shell, existem alguns casos em que a análise da saída de ls funciona é a maneira mais simples de obter o efeito desejado. Como ls pode manipular caracteres não ASCII e controlar nomes de arquivos, esses casos são um subconjunto daqueles que não exigem a obtenção de um nome de arquivo ls
.
Em python, não há absolutamente nenhuma razão para invocar ls
. Python possui todas ls
as funcionalidades incorporadas. Use os.listdir
para listar o conteúdo de um diretório e / os.stat
ou os
obter metadados do arquivo. Outras funções nos os
módulos provavelmente também serão relevantes para o seu problema.
Se você estiver acessando arquivos remotos pelo ssh, uma maneira razoavelmente robusta de listar nomes de arquivos é através do sftp:
echo ls -1 | sftp remote-site:dir
Isso imprime um nome de arquivo por linha e, diferentemente do ls
utilitário, sftp
não altera caracteres não imprimíveis. Você ainda não poderá listar de maneira confiável os diretórios nos quais um nome de arquivo contém uma nova linha, mas isso raramente é feito (lembre-se disso como um problema de segurança em potencial, não um problema de usabilidade).
Em python (lembre-se de que os metacaracteres do shell devem ser escapados remote_dir
):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
Para interações mais complexas, consulte o modo de lote do sftp na documentação.
Em alguns sistemas (Linux, Mac OS X, talvez alguns outros, mas definitivamente não o Windows), uma abordagem diferente é montar um sistema de arquivos remoto através do ssh com sshfs e depois trabalhar localmente.