Làm cho ls in tất cả trên một dòng (như trong thiết bị đầu cuối)


12

ls in khác nhau tùy thuộc vào việc đầu ra là một thiết bị đầu cuối hoặc một cái gì đó khác.

ví dụ:

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

Có cách nào để lsin ra trên một dòng như thể nó đến một thiết bị đầu cuối khi không. Có một -Cđối số sắp xếp điều đó, nhưng nó sẽ chia nó thành nhiều dòng.

$ 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

Lý do tôi muốn làm điều này là vì tôi muốn theo dõi các tệp trong một thư mục đang thay đổi nhanh chóng. Tôi đã xây dựng dòng lệnh đơn giản này:

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

Các uniq ngăn nó spam thiết bị đầu cuối của tôi và chỉ hiển thị các thay đổi. Tuy nhiên, nó đã in tất cả trên các dòng differnet, điều này làm cho uniq trở nên vô dụng và làm tăng lượng nhiễu. Về lý thuyết người ta có thể sử dụng watchcho việc này, nhưng tôi muốn xem một tập tin ngay khi nó xuất hiện / biến mất.

Đây là giải pháp cuối cùng:

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

4
nếu bạn đang chuyển ls sang lệnh khác, bạn đang làm sai. Bạn thực sự đang cố gắng để đạt được điều gì?
Justin

Justin, tôi đã cập nhật câu hỏi với một lời giải thích.
Rory

Câu trả lời:


16

Tôi không biết về một công tắc có thể làm điều đó, nhưng bạn có thể chuyển đầu ra của mình trđể thực hiện:

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

14
ls | xargs

Nó hoạt động với tôi, đó là cách đơn giản nhất tôi từng thấy. Hy vọng điều này sẽ giúp bạn là tốt.



4

ah, bây giờ bạn đã cập nhật câu hỏi ....

while true ; do echo * ; done | uniq

sẽ làm những gì bạn đăng, chỉ đơn giản hơn.

tuy nhiên, tốt hơn hết là bạn nên sử dụng thứ gì đó sử dụng inotify để làm điều này .. như

inotifywait -m . -e create,delete

nếu bạn không có inotify, thì một cái gì đó như thế này cũng hoạt động tốt:

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

Đây có thể là những gì bạn đang tìm kiếm nhưng tôi có thể đã hiểu nhầm câu hỏi của bạn nhưng ở đây đi :)

Một vài lệnh đáng để xem xét:

xem - thực hiện chương trình định kỳ, hiển thị xargs toàn màn hình đầu ra - xây dựng và thực thi các dòng lệnh từ đầu vào tiêu chuẩn (-0 nếu bạn muốn xử lý các tệp có khoảng trắng, v.v.)

Bạn có thể làm một cái gì đó như sau để hiển thị 10 tệp / thư mục cuối cùng đã thay đổi với khoảng thời gian 2 giây (mặc định cho đồng hồ)

xem "ls -lart | đuôi -10"

các tùy chọn -lart bảo ls dài dòng và sắp xếp dựa trên thời gian sửa đổi.

Nếu bạn thực sự chỉ muốn các tập tin, tôi sẽ làm một cái gì đó như:

xem "ls -lart | awk '{print \ $ 8}' | đuôi -10 | xargs"

hoặc chỉ để hiển thị chúng:

ls-bắt đầu | awk '{in $ 8}' | đuôi -10 | xargs


0

Bạn có thể sử dụng đánh dấu lại trong vỏ để đạt được điều này như sau:

echo -E `ls -1`

Không hoạt động với tất cả các tên tệp. Hãy thử:touch ./-en
kasperd

Điều đó chỉ quan trọng nếu bạn không có tệp nào bắt đầu với [a-d]loại đó trước nó. Nếu bạn đang chạy nó trong một kịch bản echo -Esẽ không quá bất tiện và dòng mới có thể không quan trọng.
gà con

0

Điều này hiệu quả với tôi vì tôi không chỉ cần in kết quả trong một dòng mà tôi còn cần chỉ định cách tách nó ra và bạn có thể chỉ định điều đó với ORS

ls -1 | awk '{ ORS="|"; print; }'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.