Apa gunanya ls -f (atau, mengapa ini menggantung?)

9

Saya punya direktori dengan sekitar 100.000 file di dalamnya. Jika hang lebih dari satu menit. Saya berlari strace, dan segera mulai melihat getdents, jadi ls jelas membaca direktori. Saya juga melihat banyak panggilan ke brk, jadi ls jelas buffering hal-hal di memori. Saya menulis sebuah program sederhana yang memanggil readdir dan menampilkan nama file, dan segera merespons. Tapi ls -f tidak memberikan output. Apa yang menyebabkannya? Saya pikir inti dari -f adalah menyebabkan ls tidak melakukan apa-apa selain readdir. Apakah ada cara yang portabel dan andal untuk membuat daftar isi direktori? (Catatan, ini adalah ls dari coreutils gnu di Linux.)

-EDIT-

Ada alias di tempat, tetapi "/ bin / ls -1f> / dev / null" membutuhkan waktu 8 hingga 15 detik, "/ bin / ls -1fx> / dev / null" membutuhkan 4 hingga 11 detik, tetapi sebuah program sederhana readdir hanya membutuhkan 0,011 detik. Apa yang harus saya lakukan untuk membuat gnu tidak mengisap?

William Pursell
sumber

Jawaban:

7

Intinya -fadalah untuk mencoba dan menghindari kebutuhan untuk mengatur setiap entri file, dan untuk menghindari kebutuhan untuk membaca semuanya sebelum ada yang ditampilkan. Ini adalah opsi "meta" yang hanya menonaktifkan opsi lain.

Jadi, ya, itu harus melakukan apa yang Anda harapkan. Saya tidak bisa menjawab mengapa tidak, tapi saya kira Anda mungkin memiliki shell alias atau sesuatu yang lain yang memasukkan opsi tambahan ke perintah. Itu mungkin mengaktifkan kembali fitur daripada -fmenonaktifkan, dan dianggap "lebih spesifik", jadi didahulukan.

Daniel Pittman
sumber
2
Argghh. ls () {/ bin / ls -FB $ @; } Skrip startup yang bodoh.
William Pursell
1
hmm Saya membatalkan fungsi dan saya masih melihat perilaku yang sama bahkan ketika saya menjalankan / bin / ls.
William Pursell
Do / bin / ls -f -1 (itu minus-satu, bukan minus-ell). / Bin / ls pada kotak RHEL Saya menggunakan format nama file dalam kolom untuk beberapa alasan.
Bruce Ediger
0

Pengoptimalan ditambahkan di coreutils 7.0 (komit 8d974b00fbbc2025de63e1e6d54827648fefa1c4):

2008-08-01  Kamil Dudka  <[email protected]>
    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.

Penjelasan pertama yang terlintas dalam pikiran adalah bahwa Anda menjalankan versi coreutils yang lebih lama. Anda perlu meningkatkan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber