Заставьте ls вывести все это в одну строку (как в терминале)

Заставьте ls вывести все это в одну строку (как в терминале)

lsпечатает по-разному в зависимости от того, выводится ли информация на терминал или куда-то еще.

например:

$ ls .
file1  file2
$ ls . | head
file1
file2

Есть ли способ сделать lsраспечатку в одну строку, как будто это терминал, когда это не так. Есть аргумент -C, который как бы делает это, но он разделит его на несколько строк.

$ 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

Причина, по которой я хочу это сделать, заключается в том, что я хочу отслеживать файлы в каталоге, которые быстро менялись. Я составил эту простую командную строку:

while [[ true ]] ; do ls ; done | uniq

Uniq не дает ему спамить мой терминал и показывать только изменения. Однако он печатал все это на разных строках, что делало uniq бесполезным и увеличивало количество шума. Теоретически можно было бы использовать watchдля этого, но я хотел видеть файл сразу после его появления/исчезновения.

Вот окончательное решение:

while [[ true ]] ; do ls | tr '\n' ' ' ; done | uniq

решение1

Я не знаю переключателя, который мог бы это сделать, но вы можете передать свой вывод, trчтобы сделать это:

ls | tr "\n" " " | <whatever you like>

решение2

ls | xargs

Это работает для меня, это самый простой способ, который я когда-либо находил. Надеюсь, это поможет и вам.

решение3

Если у вас lsесть такая возможность, вы можете использовать высокое значение, и это может дать желаемый результат:

ls -w 10000 -C . | head

решение4

ах, теперь, когда вы обновили вопрос...

while true ; do echo * ; done | uniq

сделаю то, что вы написали, только проще.

Однако вам лучше использовать что-то, что использует inotify для этого... например

inotifywait -m . -e create,delete

Если у вас нет inotify, то подойдет и что-то вроде этого:

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)

Связанный контент