Niech ls wydrukuje wszystko w jednym wierszu (jak w terminalu)

15

ls wypisuje inaczej w zależności od tego, czy dane wyjściowe są wysyłane do terminala, czy do czegoś innego.

na przykład:

$ ls .
file1  file2
$ ls . | head
file1
file2

Czy jest jakiś sposób na lswydrukowanie w jednym wierszu, tak jakby to było do terminala, kiedy nie jest. Istnieje -Cargument, że sorta to robi, ale podzieli to na kilka linii.

$ 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

Powodem, dla którego chcę to zrobić, jest to, że chcę monitorować pliki w katalogu, który zmieniał się szybko. Zbudowałem tę prostą linię poleceń:

while [[ true ]] ; do ls ; done | uniq

Uniq zapobiega spamowaniu mojego terminala i pokazywaniu tylko zmian. Jednak drukował to wszystko na różnych liniach, co czyniło uniq bezużytecznym i zwiększało ilość szumu. Teoretycznie można to wykorzystać watch, ale chciałem zobaczyć plik, jak tylko się pojawi / zniknie.

To jest ostateczne rozwiązanie:

while [[ true ]] ; do ls | tr '\n' ' ' ; done | uniq
Rory
źródło
4
jeśli przesyłasz ls do innego polecenia, robisz coś złego. Co tak naprawdę próbujesz osiągnąć?
Justin
Justin, zaktualizowałem pytanie o wyjaśnienie.
Rory,

Odpowiedzi:

15

nie znam przełącznika, który mógłby to zrobić, ale możesz przepuścić wyjście, traby to zrobić:

ls | tr "\n" " " | <whatever you like>
chrześcijanin
źródło
18
ls | xargs

To działa dla mnie, to najprostszy sposób, jaki kiedykolwiek znalazłem. Mam nadzieję, że to również pomoże.

Jian Weihang
źródło
4

Jeśli masz lstę opcję, możesz użyć wysokiej wartości i może zrobić to, co chcesz:

ls -w 10000 -C . | head
Wstrzymano do odwołania.
źródło
4

ah, teraz zaktualizowałeś pytanie ....

while true ; do echo * ; done | uniq

zrobi to, co napisałeś, po prostu prościej.

jednak lepiej jest użyć czegoś, co używa inotify, aby to zrobić

inotifywait -m . -e create,delete

jeśli nie masz powiadomienia, wówczas coś podobnego również działa dobrze:

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)
Justin
źródło
3

Co z dość trywialnym

echo *

? :-) Nie musisz nawet za to rozwidlać. :-)

peterh - Przywróć Monikę
źródło
0

To może być to, czego szukasz, ale mogłem źle zrozumieć twoje pytanie, ale oto idzie :)

Kilka poleceń, na które warto spojrzeć:

watch - okresowo uruchamiaj program, wyświetlając wyjściowe pełnoekranowe xargs - buduj i wykonuj wiersze poleceń ze standardowego wejścia (-0, jeśli chcesz obsługiwać pliki ze spacjami itp.)

Możesz wykonać następujące czynności, aby wyświetlić 10 ostatnich plików / katalogów, które zmieniły się w odstępie 2 sekund (domyślnie dla zegarka)

oglądaj "ls -lart | tail -10"

opcje -lart informują ls, że jest gadatliwy i sortuje według czasu modyfikacji.

Jeśli naprawdę chcesz tylko pliki, zrobiłbym coś takiego:

obejrzyj "ls -lart | awk '{print \ $ 8}' | tail -10 | xargs"

lub po prostu je wyświetlić:

ls -lart | awk '{print 8 $}' | ogon -10 | xargs

ScottZ
źródło
0

Możesz użyć tylnych kleszczy w powłoce, aby to osiągnąć:

echo -E `ls -1`
pisklęta
źródło
Nie działa ze wszystkimi nazwami plików. Spróbuj:touch ./-en
kasperd
Ma to znaczenie tylko wtedy, gdy nie masz plików zaczynających się od [a-d]tego rodzaju przed nim. Jeśli uruchamiasz go w skrypcie echo -E, nie byłoby to zbyt niewygodne, a końcowy znak nowej linii może nie mieć znaczenia.
pisklęta
0

To działało dla mnie, ponieważ musiałem nie tylko wydrukować wynik w jednym wierszu, ale także musiałem określić, w jaki sposób należy go rozdzielić, a można to określić za pomocą ORS

ls -1 | awk '{ ORS="|"; print; }'
mavi
źródło