Faça ls imprimir tudo em uma linha (como no terminal)

9

ls é impresso de forma diferente, dependendo se a saída é para um terminal ou para outra coisa.

por exemplo:

$ ls .
file1  file2
$ ls . | head
file1
file2

Existe alguma maneira de fazer ls imprimir em uma linha como se fosse um terminal quando não é. Existe um argumento -C que sorta faz isso, mas irá dividi-lo em várias linhas.

$ ls
file1  file10  file11  file12  file13  file14  file15  file16  file17  file18  file19 file2  file3  file4  file5  file6  file7  file8  file9
$ ls -C . | head
file1 file11 file13 file15 file17 file19 file3  file5  file7  file9
file10 file12 file14 file16 file18 file2 file4  file6  file8

A razão pela qual eu quero fazer isso é que eu quero monitorar os arquivos em um diretório que estava mudando rapidamente. Eu construí esta linha de comando simples:

while [[ true ]] ; do ls ; done | uniq

O uniq impede que ele envie spam para o meu terminal e apenas mostre alterações. No entanto, estava imprimindo tudo em linhas diferentes, o que tornava o uniq inútil e aumentava a quantidade de ruído. Em teoria, pode-se usar watch para isso, mas eu queria ver um arquivo assim que aparecesse / desaparecesse.

Esta é a solução final:

while [[ true ]] ; do ls | tr '\n' ' ' ; done | uniq
    
por Rory 24.01.2010 / 16:37

7 respostas

14

Eu não sei de um switch que poderia fazer isso, mas você pode canalizar sua saída através de tr para fazer isso:

ls | tr "\n" " " | <whatever you like>
    
por 24.01.2010 / 16:48
6
ls | xargs

Funciona para mim, é a maneira mais simples que encontrei. Espero que isso ajude você também.

    
por 31.10.2014 / 07:52
4

Se o seu ls tiver essa opção, você poderá usar um valor alto e poderá fazer o que quiser:

ls -w 10000 -C . | head
    
por 24.01.2010 / 16:49
3

ah, agora que você atualizou a pergunta ....

while true ; do echo * ; done | uniq

fará o que você postou, apenas mais simples.

no entanto, é melhor usar algo que use inotify para fazer isso ... como

inotifywait -m . -e create,delete

se você não tem inotify, então algo assim funciona bem também:

import os
import time

last = set()
while True:
    cur = set(os.listdir('.'))
    added = cur-last
    removed = last-cur
    if added: print 'added', added
    if removed: print 'removed', removed
    last = set(os.listdir('.'))
    time.sleep(0.1)
    
por 28.01.2010 / 05:38
2

E o que é bastante trivial

echo *

:-) Você não precisa nem de garfo para isso. : -)

    
por 28.01.2017 / 00:15
0

Isso pode ser o que você está procurando, mas eu posso ter entendido mal sua pergunta, mas aqui vai :)

Alguns comandos que valem a pena analisar:

watch - executa um programa periodicamente, mostrando a saída em tela cheia xargs - constrói e executa linhas de comando a partir da entrada padrão (-0 se você quiser manipular arquivos com espaços, etc.)

Você pode fazer algo parecido com o seguinte para mostrar os 10 últimos arquivos / dirs que mudaram com um intervalo de 2 segundos (padrão para o relógio)

watch "ls -lart | tail -10"

as opções -lart informam ls para ser verboso e classificar com base no tempo de modificação.

Se você realmente quer apenas os arquivos, eu gostaria de fazer algo como:

watch "ls -lart | awk '{print \}' | tail -10 | xargs"

ou apenas para exibi-los:

ls -lart | awk '{print $8}' | tail -10 | xargs

    
por 28.01.2010 / 05:49
0

Você pode usar carrapatos no shell para conseguir isso:

echo -E 'ls -1'
    
por 27.01.2017 / 23:27