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

14

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
Рори
источник
4
если вы передаете команду ls другой команде, вы делаете что-то не так. Что вы на самом деле пытаетесь достичь?
Джастин
Джастин, я обновил вопрос объяснением.
Рори

Ответы:

16

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

ls | tr "\n" " " | <whatever you like>
Кристиан
источник
16
ls | xargs

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

Цзянь Вэйхан
источник
4

Если у вас 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)
Джастин
источник
3

Как насчет довольно тривиальным

echo *

? :-) Вам не нужно даже раскошелиться на это. :-)

Петер - Восстановить Монику
источник
0

Это может быть то, что вы ищете, но я, возможно, неправильно понял ваш вопрос, но здесь идет :)

Несколько команд, на которые стоит обратить внимание:

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

ScottZ
источник
0

Вы можете использовать обратные галочки в оболочке для достижения этой цели:

echo -E `ls -1`
птенцы
источник
Не работает со всеми именами файлов. Попробуйте:touch ./-en
kasperd
Это имеет значение только в том случае, если у вас нет файлов, начинающихся с [a-d]этого вида до него. Если вы запускаете его в скрипте, echo -Eэто не будет слишком неудобно, и завершающий перевод строки может не иметь значения.
птенцы
0

Это сработало для меня, потому что мне нужно было не только напечатать результат в одну строку, но и мне нужно было указать, как его нужно разделить, и вы можете указать это с помощью ORS

ls -1 | awk '{ ORS="|"; print; }'
Mavi
источник