Зробіть ls друкувати все на одному рядку (як у терміналі)


15

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 іншій команді, ви робите щось не так. Що ви насправді намагаєтесь досягти?
Джастін

Джастін, я оновив питання з поясненнями.
Рорі

Відповіді:


15

Я не знаю комутатора, який міг би це зробити, але ви можете trпередати свій вихід через це:

ls | tr "\n" " " | <whatever you like>

18
ls | xargs

Це працює для мене, це найпростіший спосіб, який я знайшов коли-небудь. Сподіваюся, це допоможе і вам.



4

ах, тепер, коли ви оновили питання ...

while true ; do echo * ; done | uniq

зробить те, що ви розмістили, просто простіше.

однак, вам краще використовувати щось, що використовує inotify для цього

inotifywait -m . -e create,delete

якщо ви не зробили ініціативу, то щось подібне також працює:

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 | хвіст -10"

параметри -запустіть, що ls є багатослівним і сортуйте на основі часу модифікації.

Якщо ви дійсно хочете файлів, я б просто зробив щось на кшталт:

дивитись "ls -lart | awk" {print \ $ 8} '| хвіст -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.