ls
imprime 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 ls
imprimir em uma linha como se fosse para um terminal quando não é. Há um -C
argumento que faz isso, mas vai 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 quero fazer isso é 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 evita que ele envie spam para meu terminal e mostre apenas alterações. Porém, ele 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 watch
para isso, mas eu queria ver um arquivo assim que ele aparecesse/desaparecesse.
Esta é a solução final:
while [[ true ]] ; do ls | tr '\n' ' ' ; done | uniq
Responder1
não conheço uma opção que possa fazer isso, mas você pode canalizar sua saída tr
para fazer isso:
ls | tr "\n" " " | <whatever you like>
Responder2
ls | xargs
Funciona para mim, é a maneira mais simples que encontrei. Espero que isso ajude você também.
Responder3
Se você ls
tiver essa opção, você pode usar um valor alto e pode fazer o que quiser:
ls -w 10000 -C . | head
Responder4
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 possui o inotify, algo assim também funciona 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)