ls
печатает по-разному в зависимости от того, выводится ли вывод на терминал или на что-то еще.
например.:
$ ls .
file1 file2
$ ls . | head
file1
file2
Есть ли способ сделать ls
распечатайте в одной строке, как если бы это было для терминала, когда это не так. Есть -C
аргумент, что sorta делает это, но разбивает его на несколько строк.
$ 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
ls | xargs
У меня это работает, это самый простой способ, который я когда-либо находил. Надеюсь, это поможет и вам.
Я не знаю переключателя, который мог бы это сделать, но вы можете передать свой вывод через tr
сделать это:
ls | tr "\n" " " | <whatever you like>
Если ваш ls
есть этот параметр, вы можете использовать высокое значение, и он может делать то, что вы хотите:
ls -w 10000 -C . | head
ах, теперь, когда вы обновили вопрос ....
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)
Что насчет довольно банального
echo *
? :-) Для этого не нужно даже форк. :-)
Это может быть то, что вы ищете, но, возможно, я неправильно понял ваш вопрос, но вот оно:
Несколько команд, на которые стоит обратить внимание:
watch - периодически выполнять программу, показывая вывод в полноэкранном режиме xargs - строить и выполнять командные строки из стандартного ввода (-0, если вы хотите обрабатывать файлы с пробелами и т. д.)
Вы можете сделать что-то вроде следующего, чтобы показать последние 10 файлов / каталогов, которые изменились с интервалом в 2 секунды (по умолчанию для часов)
часы "ls -lart | tail -10"
параметры -lart говорят ls быть подробным и отсортировать по времени модификации.
Если вам действительно нужны файлы, я бы сделал что-то вроде:
смотреть "ls -lart | awk '{print \ $ 8}' | tail -10 | xargs"
или просто отобразить их:
ls -lart | awk '{print $ 8}' | хвост -10 | xargs
Вы можете использовать обратные галочки в оболочке, чтобы добиться этого, например:
echo -E `ls -1`
Это сработало для меня, потому что мне нужно было не только распечатать результат в одной строке, но также мне нужно было указать, как он должен быть разделен, и вы можете указать это с помощью ОРС
ls -1 | awk '{ ORS="|"; print; }'