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>
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
ls | xargs
Funciona para mim, é a maneira mais simples que encontrei. Espero que isso ajude você também.
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
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)
E o que é bastante trivial
echo *
:-) Você não precisa nem de garfo para isso. : -)
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
Você pode usar carrapatos no shell para conseguir isso:
echo -E 'ls -1'