Назад | Перейти на главную страницу

Заставьте ls распечатать все в одной строке (как в терминале)

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; }'