Estou usando o ls -a
comando para obter os nomes de arquivo em um diretório, mas a saída está em uma única linha.
Como isso:
. .. .bash_history .ssh updater_error_log.txt
Eu preciso de uma alternativa embutida para obter nomes de arquivos, cada um em uma nova linha, assim:
.
..
.bash_history
.ssh
updater_error_log.txt
ls
passar para o python,ls
produzirá um arquivo por linha, como expliquei na minha resposta.ls
a saída parapython
e observou a saída de linha única em python?Respostas:
Use a
-1
opção (observe que esse é um dígito "um", não uma letra minúscula "L"), assim:Primeiro, porém, verifique se seus
ls
apoios-1
. Coreutils GNU (instalados em sistemas Linux padrão) e Solaris fazem; mas em caso de dúvida, useman ls
ouls --help
ou verifique a documentação. Por exemplo:fonte
ls --help
saída ... sempre instalados ;-)linux ls one file per line
e este foi o artigo principal. Não consigo acreditar o quão prolífica é a resposta escolhida ou que essa resposta tem menos votos do que a resposta que você deseja.ls -1
ftw.ls
assume o-1
comportamento padrão quando a saída não está conectada ao terminal.Sim, você pode criar facilmente
ls
um nome de arquivo por linha:Explicação: O comando
ls
detecta se a saída é para um terminal ou arquivo ou tubo e se ajusta de acordo.Portanto, se você usar o
ls -a
python, ele funcionará sem nenhuma medida especial.fonte
ls
é apenas algumas despojada versão de modo não suporta-1
.
e..
" exibidos na saída?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 todasls
as funcionalidades incorporadas. Useos.listdir
para listar o conteúdo de um diretório e /os.stat
ouos
obter metadados do arquivo. Outras funções nosos
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:
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
):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.
fonte
você pode usar
ls -1
ls -l
também fará o trabalhofonte
ls -l
que não deve ser usada.Fácil, desde que seus nomes de arquivos não incluam novas linhas:
Se você estiver enviando isso para outro comando, provavelmente preferirá separar seus nomes de arquivos por bytes nulos, em vez de novas linhas, pois bytes nulos não podem ocorrer em um nome de arquivo (mas as novas linhas podem):
Imprimir isso em um terminal provavelmente será exibido como uma linha, porque bytes nulos normalmente não são impressos. Alguns programas podem precisar de uma opção específica para lidar com entradas delimitadas por nulos, como
sort
's-z
. Da mesma forma, seu próprio script precisaria explicar isso.fonte