Заставьте 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

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

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)


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


0

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

echo -E `ls -1`

Не работает со всеми именами файлов. Попробуйте:touch ./-en
kasperd

Это имеет значение только в том случае, если у вас нет файлов, начинающихся с [a-d]этого вида до него. Если вы запускаете его в скрипте, echo -Eэто не будет слишком неудобно, и завершающий перевод строки может не иметь значения.
птенцы

0

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

ls -1 | awk '{ ORS="|"; print; }'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.