Điểm của ls -f (hoặc, tại sao lại treo này?)


9

Tôi đã có một thư mục chứa khoảng 100.000 tệp trong đó. ls -f bị treo trong hơn một phút. Tôi chạy strace, và ngay lập tức bắt đầu thấy getdents, vì vậy ls đang đọc thư mục rõ ràng. Tôi cũng thấy rất nhiều cuộc gọi đến brk, vì vậy ls rõ ràng là đệm mọi thứ trong bộ nhớ. Tôi đã viết một chương trình đơn giản gọi readdir và xuất ra tên tệp, và nó phản hồi ngay lập tức. Nhưng ls -f không cung cấp đầu ra. Đưa cái gì? Tôi nghĩ rằng toàn bộ quan điểm của -f là nó khiến ls không làm gì khác hơn là readdir. Có một cách di động, đáng tin cậy để liệt kê các nội dung của một thư mục? (Lưu ý, đây là ls từ coreutils của gnu trên Linux.)

-BIÊN TẬP-

Có một bí danh tại chỗ, nhưng "/ bin / ls -1f> / dev / null" mất 8 đến 15 giây, "/ bin / ls -1fx> / dev / null" mất 4 đến 11 giây, nhưng một chương trình đơn giản điều đó chỉ làm readdir mất 0,011 giây. Tôi cần làm gì để khiến gnu không bị hút?

Câu trả lời:


7

Mục đích của việc -flà thử và tránh sự cần thiết phải thống kê mọi mục nhập tệp và để tránh phải đọc tất cả trước khi bất kỳ mục nào được hiển thị. Đây là một tùy chọn "meta" chỉ vô hiệu hóa các tùy chọn khác.

Vì vậy, vâng, nó nên làm những gì bạn mong đợi. Tôi không thể trả lời tại sao không, nhưng tôi đoán rằng bạn có thể có bí danh shell hoặc cái gì khác chèn các tùy chọn bổ sung cho lệnh. Điều đó có thể có một tính năng hơn là -fvô hiệu hóa và được coi là "cụ thể hơn", vì vậy hãy ưu tiên.


2
Luận. ls () {/ bin / ls -FB $ @; } Kịch bản khởi động ngu ngốc.
William Pursell

1
hmm Tôi bỏ đặt chức năng và tôi vẫn thấy hành vi tương tự ngay cả khi tôi chạy / bin / ls.
William Pursell

Do / bin / ls -f -1 (đó là trừ một, không phải trừ-ell). Vì lý do / bin / ls trên hộp RHEL tôi đang sử dụng định dạng tên tệp trong các cột vì một số lý do.
Bruce Ediger

0

Một tối ưu hóa đã được thêm vào coreutils 7.0 (cam kết 8d974b00fbbc2025de63e1e6d54827648fefa1c4):

2008-08-01  Kamil Dudka  <kdudka@redhat.com>
    ls -U1 now uses constant memory
    When printing one name per line and not sorting, ls now uses
    constant memory per directory, no matter how many files are in
    the directory.
    * ls.c (print_dir): Print each file name immediately, when possible.
    * NEWS: Mention the improvement.

Lời giải thích đầu tiên xuất hiện trong đầu là bạn đang chạy một phiên bản lõi cũ hơn. Bạn cần nâng cấp.

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.