desenv-web-rp.com

Como faço para listar um nome de arquivo por linha de saída no Linux?

Estou usando o comando ls -a para obter os nomes dos arquivos 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 interna para obter nomes de arquivos, cada um em uma nova linha, assim:

.  
..  
.bash_history  
.ssh  
updater_error_log.txt
181
fixxxer

Use a opção -1 (note que este é um dígito "um", não uma letra minúscula "L"), assim:

ls -1a

Primeiro, no entanto, certifique-se de que seu ls suporte -1. GNU coreutils (instalados em sistemas Linux padrão) e Solaris do; mas em caso de dúvida, use man ls ou ls --help ou verifique a documentação. Por exemplo.:

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

Sim, você pode facilmente fazer com que ls imprima um nome de arquivo por linha:

ls -a | cat

Explicação: O comando ls detecta se a saída é para um terminal ou para um arquivo ou canal e se ajusta de acordo.

Então, se você canalizar ls -a para python ele deve funcionar sem nenhuma medida especial.

118
Peter G.

Ls é projetado para consumo humano e você não deve analisar sua saída .

Em scripts Shell, há alguns casos em que a análise da saída de ls funciona é a maneira mais simples de alcançar 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 de ls.

Em python, não há absolutamente nenhuma razão para invocar ls. Python tem todas as funcionalidades do ls embutidas. Use os.listdir para listar o conteúdo de um diretório e os.stat ou os para obter os metadados do arquivo. Outras funções nos módulos os provavelmente serão relevantes para o seu problema também.


Se você está acessando arquivos remotos através do 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, ao contrário do utilitário ls, sftp não manipula caracteres não imprimíveis. Você ainda não conseguirá listar diretórios de forma confiável onde um nome de arquivo contém uma nova linha, mas isso raramente é feito (lembre-se disso como um possível problema de segurança, não um problema de usabilidade).

Em python (cuidado com o fato de que os metacaracteres do Shell devem ser escapes em 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, procure o modo batch do sftp na documentação.

Em alguns sistemas (Linux, Mac OS X, talvez alguns outros unices, mas definitivamente não Windows), uma abordagem diferente é montar um sistema de arquivos remoto através de ssh com sshfs , e então trabalhar localmente.

28
Gilles

você pode usar ls -1

ls -l também fará o trabalho

10
ILF

Fácil, desde que seus nomes de arquivos não incluam novas linhas:

find . -maxdepth 1

Se você estiver colocando isso em outro comando, provavelmente deverá preferir separar seus nomes de arquivos por bytes nulos, em vez de novas linhas, pois os bytes nulos não podem ocorrer em um nome de arquivo (mas as novas linhas podem):

find . -maxdepth 1 -print0

Imprimir em um terminal provavelmente será exibido como uma linha, porque os bytes nulos não são normalmente impressos. Alguns programas podem precisar de uma opção específica para manipular entrada delimitada por nulo, como -z de sort. Seu próprio script da mesma forma precisaria explicar isso.

1
8bittree