ls
imprime de manera diferente dependiendo de si la salida es a una terminal o a otra cosa.
p.ej:
$ ls .
file1 file2
$ ls . | head
file1
file2
¿Hay alguna manera de ls
imprimir en una línea como si fuera a una terminal cuando no lo es? Hay un -C
argumento que más o menos hace eso, pero lo dividirá en varias líneas.
$ 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
La razón por la que quiero hacer esto es que quiero monitorear los archivos en un directorio que cambiaban rápidamente. Había construido esta sencilla línea de comando:
while [[ true ]] ; do ls ; done | uniq
El uniq evita que envíe spam a mi terminal y solo muestre cambios. Sin embargo, lo imprimió todo en diferentes líneas de red, lo que inutilizó el uniq y aumentó la cantidad de ruido. En teoría, se podría utilizar watch
para esto, pero quería ver un archivo tan pronto como apareciera/desapareciera.
Esta es la solución final:
while [[ true ]] ; do ls | tr '\n' ' ' ; done | uniq
Respuesta1
No conozco ningún interruptor que pueda hacer eso, pero puedes canalizar tu salida tr
para hacerlo:
ls | tr "\n" " " | <whatever you like>
Respuesta2
ls | xargs
A mí me funciona, es la forma más sencilla que he encontrado. Espero que esto también te ayude.
Respuesta3
Si ls
tiene esta opción, puede usar un valor alto y podría hacer lo que quiera:
ls -w 10000 -C . | head
Respuesta4
Ah, ahora que has actualizado la pregunta...
while true ; do echo * ; done | uniq
Hará lo que publicaste, simplemente más simple.
sin embargo, es mejor que uses algo que use inotify para hacer esto... como
inotifywait -m . -e create,delete
Si no tienes inotify, algo como esto también funciona bien:
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)