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

12

ls imprime de maneira 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 lsimprimir em uma linha como se fosse um terminal quando não estiver. Há um -Cargumento que meio que faz isso, mas o dividirá 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

O motivo pelo qual desejo fazer isso é que desejo monitorar os arquivos em um diretório que estavam 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, alguém poderia usar watchisso, mas eu queria ver um arquivo assim que ele aparecesse / desaparecesse.

Esta é a solução final:

while [[ true ]] ; do ls | tr '\n' ' ' ; done | uniq
Rory
fonte
4
se você estiver encaminhando sl para outro comando, estará fazendo algo errado. O que você está realmente tentando realizar?
Justin Justin
Justin, atualizei a pergunta com uma explicação.
Rory

Respostas:

16

Eu não sei de um switch que poderia fazer isso, mas você pode canalizar sua saída trpara fazer isso:

ls | tr "\n" " " | <whatever you like>
cristão
fonte
12
ls | xargs

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

Jian Weihang
fonte
4

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

ls -w 10000 -C . | head
Dennis Williamson
fonte
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 usa inotify para fazer isso.

inotifywait -m . -e create,delete

se você não tiver inotify, algo assim também funcionará bem:

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)
Justin
fonte
3

E o bastante trivial

echo *

? :-) Você nem precisa se esforçar para isso. :-)

peterh
fonte
0

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

Alguns comandos que vale a pena examinar:

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

Você pode fazer algo como o seguinte para mostrar os últimos 10 arquivos / diretórios que foram alterados com um intervalo de 2 segundos (padrão para observação)

assista "ls -lart | tail -10"

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

Se você realmente quer apenas os arquivos, eu faria algo como:

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

ou apenas para exibi-los:

ls -art | awk '{print $ 8}' | cauda -10 | xargs

ScottZ
fonte
0

Você pode usar ticks de volta no shell para conseguir isso como:

echo -E `ls -1`
filhotes
fonte
Não funciona com todos os nomes de arquivos. Tente:touch ./-en
kasperd 28/01
Isso só importa se você não tiver arquivos começando com [a-d]esse tipo antes. Se você o estiver executando em um script echo -E, não seria muito inconveniente e a nova linha à direita pode não importar.
pintainhos