ทำให้ ls พิมพ์ทั้งหมดในหนึ่งบรรทัด (เช่นในเทอร์มินัล)


15

ls พิมพ์แตกต่างกันไปขึ้นอยู่กับว่าการส่งออกไปยังขั้วหรือสิ่งอื่น

เช่น:

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

มีวิธีที่จะlsพิมพ์ออกมาในหนึ่งบรรทัดราวกับว่ามันเป็นขั้วเมื่อมันไม่ได้ มี-Cอาร์กิวเมนต์ที่ sorta ทำ แต่จะแยกออกเป็นหลายบรรทัด

$ 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 ป้องกันไม่ให้สแปมเทอร์มินัลของฉันและแสดงการเปลี่ยนแปลงเท่านั้น อย่างไรก็ตามมันกำลังพิมพ์ทั้งหมดบนบรรทัด differnet ซึ่งทำให้ uniq ไร้ประโยชน์และเพิ่มปริมาณของเสียงรบกวน ในทางทฤษฎีเราสามารถใช้watchสิ่งนี้ได้ แต่ฉันต้องการเห็นไฟล์ทันทีที่มันปรากฏขึ้น / หายไป

นี่คือทางออกสุดท้าย:

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

4
หากคุณกำลังไพพ์ ls ไปยังคำสั่งอื่นคุณกำลังทำสิ่งผิดปกติ คุณพยายามทำอะไรจริงๆ
Justin

จัสตินฉันได้อัปเดตคำถามพร้อมคำอธิบายแล้ว
Rory

คำตอบ:


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

นี่อาจเป็นสิ่งที่คุณกำลังมองหา แต่ฉันอาจเข้าใจผิดคำถามของคุณ แต่ที่นี่ไป :)

คำสั่งบางคำที่ควรค่าแก่การดู:

ดู - รันโปรแกรมเป็นระยะแสดง xargs แบบเต็มหน้าจอ - สร้างและรันบรรทัดคำสั่งจากอินพุตมาตรฐาน (-0 ถ้าคุณต้องการจัดการไฟล์ที่มีช่องว่าง ฯลฯ )

คุณสามารถทำสิ่งต่อไปนี้เพื่อแสดงไฟล์ / dirs 10 ไฟล์สุดท้ายที่เปลี่ยนแปลงด้วยช่วงเวลา 2 วินาที (ค่าเริ่มต้นสำหรับการดู)

ดู "ls -lart | tail -10"

ตัวเลือก -lart บอก ls เป็น verbose และเรียงลำดับตามเวลาการปรับเปลี่ยน

หากคุณต้องการไฟล์จริงๆฉันจะทำสิ่งที่ชอบ:

ดู "ls -lart | awk '{พิมพ์ \ $ 8}' | tail -10 | xargs"

หรือเพียงแค่แสดง:

ls -lart | awk '{พิมพ์ $ 8}' | หาง -10 | xargs


0

คุณสามารถใช้การย้อนกลับในเปลือกเพื่อให้ได้สิ่งนี้:

echo -E `ls -1`

ใช้งานไม่ได้กับชื่อไฟล์ทั้งหมด ลอง:touch ./-en
kasperd

นั่นสำคัญเฉพาะถ้าคุณไม่มีไฟล์ที่เริ่มต้นด้วยการ[a-d]เรียงลำดับก่อนหน้านั้น หากคุณกำลังเรียกใช้ในสคริปต์echo -Eจะไม่สะดวกเกินไปและขึ้นบรรทัดใหม่ต่อท้ายอาจไม่สำคัญ
ลูกไก่

0

สิ่งนี้ใช้ได้กับฉันเพราะฉันไม่เพียงต้องการพิมพ์ผลลัพธ์ในหนึ่งบรรทัด แต่ยังต้องระบุว่าจะต้องแยกจากกันอย่างไรและคุณสามารถระบุด้วยORS

ls -1 | awk '{ ORS="|"; print; }'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.