Hepsini tek bir satıra yazdırın (terminalde olduğu gibi)


15

ls çıktının bir terminale mi yoksa başka bir şeye mi olduğuna bağlı olarak farklı yazdırır.

Örneğin:

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

lsSanki bir terminalde olmadığı gibi bir hatta baskı yapmanın bir yolu var mı ? -CSorta'nın bunu yaptığını iddia eden bir argüman var, ama bunu birkaç satıra böler.

$ 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

Bunu yapmak istiyorum nedeni hızlı bir şekilde değişen bir dizindeki dosyaları izlemek istiyorum. Bu basit komut satırını inşa etmiştim:

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

Uniq, terminalimi spam etmesini ve sadece değişiklikler göstermesini engelliyor. Ancak, tüm bu uniq yararsız yapan ve gürültü miktarını artıran differnet hatları yazdırıyordu. Teoride bunun için bir şey kullanılabilirdi watch, ancak bir dosyayı göründüğü / kaybolduğu anda görmek istedim.

Bu nihai çözüm:

while [[ true ]] ; do ls | tr '\n' ' ' ; done | uniq

4
Başka bir komuta ls borulama, yanlış bir şey yapıyorsun. Aslında neyi başarmaya çalışıyorsunuz?
Justin

Justin, soruyu bir açıklama ile güncelledim.
Rory

Yanıtlar:


15

Bunu yapabilen bir anahtar bilmiyorum, ama bunu tryapmak için çıkış boru olabilir :

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

19
ls | xargs

Benim için çalışıyor, şimdiye kadar bulduğum en basit yol. Umarım bu da size yardımcı olur.



4

ah, şimdi soruyu güncelledin ...

while true ; do echo * ; done | uniq

gönderdiklerinizi yapacak, sadece daha basit.

Ancak, bunu yapmak için inotify kullanan bir şey kullanarak daha iyi .. gibi

inotifywait -m . -e create,delete

inotify yoksa, böyle bir şey de iyi çalışır:

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

Aradığın şey bu olabilir ama sorunuzu yanlış anlamış olabilirim ama işte gidiyor :)

İncelemeye değer birkaç komut:

watch - bir programı periyodik olarak çalıştırır, çıktı tam ekran xargs gösterir - standart girdiden komut satırları oluşturur ve yürütür (boşluklu dosyaları işlemek istiyorsanız -0 vb.)

2 saniyelik aralıklarla değiştirilen son 10 dosyayı / dizini göstermek için aşağıdakine benzer bir şey yapabilirsiniz (izleme için varsayılan)

izlemek "ls -lart | kuyruk -10"

seçenekleri-lart değişiklik zamanına göre ayrıntılı ve sıralama ls söyle.

Eğer gerçekten sadece dosyaları istiyorsanız ben sadece gibi bir şey yapmak istiyorum:

izlemek "ls -lart | awk '{print \ $ 8}' | kuyruk -10 | xargs"

veya yalnızca görüntülemek için:

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


0

Bunu başarmak için kabuktaki keneleri kullanabilirsiniz:

echo -E `ls -1`

Tüm dosya adlarıyla çalışmaz. Deneyin:touch ./-en
kasperd

Bu, yalnızca [a-d]bu türden önce gelen dosyalarınız yoksa önemlidir . Bir komut dosyasında çalıştırıyorsanız, echo -Eçok rahatsız edici olmaz ve sondaki yeni satır önemli olmayabilir.
civcivler

0

Bu benim için işe yaradı çünkü sadece sonucu tek bir satırda yazdırmam gerekiyordu, aynı zamanda nasıl ayrılması gerektiğini belirtmem gerekiyordu ve bunu ORS ile belirtebilirsiniz.

ls -1 | awk '{ ORS="|"; print; }'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.