Haga que ls lo imprima todo en una línea (como en la terminal)

Haga que ls lo imprima todo en una línea (como en la terminal)

lsimprime 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 lsimprimir en una línea como si fuera a una terminal cuando no lo es? Hay un -Cargumento 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 watchpara 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 trpara 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 lstiene 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)

información relacionada