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)