Buat ls mencetak semuanya dalam satu baris (seperti di terminal)


12

ls mencetak berbeda tergantung pada apakah output ke terminal atau ke yang lain.

misalnya:

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

Apakah ada cara untuk lsmencetak pada satu baris seolah-olah ke terminal padahal tidak. Ada -Cargumen yang agak melakukan itu, tetapi itu akan membaginya menjadi beberapa baris.

$ 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

Alasan saya ingin melakukan ini adalah karena saya ingin memonitor file dalam direktori yang berubah dengan cepat. Saya telah membangun baris perintah sederhana ini:

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

Uniq mencegahnya mengirim spam ke terminal saya dan hanya menampilkan perubahan. Namun itu mencetak semuanya pada garis differnet, yang membuat uniq tidak berguna, dan meningkatkan jumlah noise. Secara teori orang bisa menggunakan watchini, tapi saya ingin melihat file segera setelah itu muncul / menghilang.

Ini adalah solusi terakhir:

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

4
jika Anda memipakan ls ke perintah lain, Anda melakukan sesuatu yang salah. Apa yang sebenarnya ingin Anda capai?
Justin

Justin, saya telah memperbarui pertanyaan dengan penjelasan.
Rory

Jawaban:


16

saya tidak tahu tentang saklar yang bisa melakukan itu, tetapi Anda dapat menyalurkan output Anda truntuk melakukannya:

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

14
ls | xargs

Ini bekerja untuk saya, ini adalah cara paling sederhana yang pernah saya temukan. Semoga ini bisa membantu Anda juga.



4

ah, sekarang Anda sudah memperbarui pertanyaan ....

while true ; do echo * ; done | uniq

akan melakukan apa yang Anda posting, hanya lebih sederhana.

Namun, Anda lebih baik menggunakan sesuatu yang menggunakan inotify untuk melakukan ini .. seperti

inotifywait -m . -e create,delete

jika Anda tidak memberi tahu, maka sesuatu seperti ini juga berfungsi dengan baik:

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

Ini mungkin apa yang Anda cari, tetapi saya mungkin salah mengerti pertanyaan Anda, tetapi begini :)

Beberapa perintah patut dilihat:

tonton - jalankan program secara berkala, tampilkan output layar penuh xargs - bangun dan jalankan baris perintah dari input standar (-0 jika Anda ingin menangani file dengan spasi, dll)

Anda dapat melakukan sesuatu seperti berikut ini untuk menunjukkan 10 file / dir terakhir yang berubah dengan interval 2 detik (default untuk menonton)

tonton "ls -lart | tail -10"

opsi -lart memberitahu ls untuk menjadi verbose dan mengurutkan berdasarkan waktu modifikasi.

Jika Anda benar-benar hanya ingin file saya hanya akan melakukan sesuatu seperti:

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

atau hanya untuk menampilkannya:

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


0

Anda dapat menggunakan kutu kembali di shell untuk mencapai ini seperti:

echo -E `ls -1`

Tidak bekerja dengan semua nama file. Coba:touch ./-en
kasperd

Itu hanya masalah jika Anda tidak memiliki file dimulai dengan [a-d]hal semacam itu sebelumnya. Jika Anda menjalankannya dalam skrip echo -Etidak akan terlalu merepotkan dan baris baru yang tertinggal mungkin tidak masalah.
anak ayam

0

Ini bekerja untuk saya karena saya tidak hanya perlu mencetak hasil dalam satu baris tetapi juga saya perlu menentukan bagaimana itu harus dipisahkan dan Anda dapat menentukannya dengan ORS

ls -1 | awk '{ ORS="|"; print; }'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.