Bagaimana cara membatasi jumlah file yang dicetak oleh ls?

89

Apakah ada cara untuk membatasi jumlah file yang terdaftar pada suatu lsperintah?

Saya telah melihat:

ls | head -4

tetapi untuk mendapatkan headatau taildieksekusi saya harus menunggu untuk lsmenyelesaikan eksekusi, dan dengan direktori dengan jumlah file yang sangat besar yang dapat memakan waktu cukup lama.

Saya ingin menjalankan lsperintah yang membatasi tanpa menggunakan headperintah itu.

AndreDurao
sumber

Jawaban:

109

Sudahkah Anda mencoba

ls -U | head -4

Ini harus melewati penyortiran, yang mungkin mengapa lsterlalu lama.

https://stackoverflow.com/questions/40193/quick-ls-command

niko
sumber
"ls -U" masih membaca seluruh direktori sebelum dicetak ... Saya pikir saya akan menulis skrip kecil untuk membatasi file, tetapi tautan pertanyaan itu adalah bahan bacaan yang bagus. Terima kasih niko.
AndreDurao
5
@AndreDurao, GNU ls -Utidak harus membaca seluruh direktori sebelum dicetak. Coba strace -e getdents,write ls -U > /dev/nulldi direktori besar misalnya.
Stéphane Chazelas
Sekadar catatan: jika Anda ingin mengeksekusi strace pada OSX, cari dtrace, perintah strace adalah utilitas Linux
AndreDurao
12

Jika versi Anda lsmemiliki cara untuk tidak menyortir file, seperti -Uuntuk GNU ls , gunakan. Tanpa opsi, lspertama akan membaca semua file, lalu mengurutkan nama, lalu mulai mencetak.

Kemungkinan lain adalah menjalankan find, yang mencetak nama saat menemukannya.

find . -name . -o -prune | head

(perhatikan bahwa karena headbekerja pada baris , yang mengasumsikan nama file tidak mengandung karakter baris baru).

Gilles
sumber
1
Perhatikan bahwa dalam hal GNU find(tidak seperti busybox atau heirloom findatau GNU ls -U), sepertinya GNU membaca seluruh direktori sebelum mulai mencetak.
Stéphane Chazelas
4

Mungkin Anda membutuhkan alat selain ls?

Misalnya, Randal Schwartz memiliki entri blog tentang penggunaan perlpada direktori besar yang mungkin berisi beberapa petunjuk untuk membangun sesuatu yang memenuhi kebutuhan Anda.

Dalam posting blog Randal menjelaskan bahwa keduanya lsdan findberusaha untuk membaca di semua entri direktori sebelum mencetak, sementara perlsolusi yang ia usulkan tidak.

AFresh1
sumber
Saya juga berpikir itu bisa menjadi pilihan terbaik, karena keduanya ls dan menemukan membaca seluruh direktori sebelum mencetak. Saya berencana untuk menulis skrip ruby ​​untuk melakukan itu, bukan mutiara, terima kasih untuk itu AFresh1!
AndreDurao
1
@AndreDurao, perlmungkin menggunakan readdir(3)like lsatau find. readdir(3)pada versi saat ini dari GNU / Linux setidaknya tidak memanggil getdents()system call dengan besar count (yang benar-benar tidak umum mengoptimalkan kinerja dengan mengurangi jumlah panggilan sistem yang dibuat). Tetapi dalam kasus Anda, jika Anda menginginkan lebih sedikit file, sepertinya Anda harus mem readdir- bypass dan menggunakan BSD getdirentries(3)atau getdents(2)sistem call saja.
Stéphane Chazelas
3

Jika kinerja bukan masalah (seperti dalam pertanyaan yang ditutup sebagai duplikat yang satu ini), dan Anda ingin membuat daftar file n pertama (sebagai lawan dari n baris pertama dari output ls) dalam daftar non- file tersembunyi diurutkan berdasarkan nama file, dengan zsh, Anda dapat menggunakan:

ls -ld -- *([1,4])

untuk mendaftar 4 file pertama. zshmasih akan membaca seluruh isi direktori, walaupun Anda menyuruhnya untuk tidak menyortirnya *(oN[1,4])(catat itu ls juga mengurutkan daftar itu).

Stéphane Chazelas
sumber
1

Mungkin kurang cocok untuk kebutuhan Anda?

 ls /usr/bin | less

Bagi saya, ini bekerja secara instan pada laptop berusia 5 tahun dengan HDD klasik, tetapi head-nya juga sama cepatnya.

Anda dapat mengakhiri lessprematur dengan q.

Saya kira asumsi Anda tentang sumber keterlambatan 1s salah, tapi mungkin tergantung pada rasa Unix Anda atau shell Anda, kurang atau perintah kepala.

Di Linux, dengan GNU-ls,

 ls -R /usr | less 

mulai mengeluarkan segera bagi saya, sementara seluruh keluaran berjalan dan berjalan - jadi sudah pasti tidak selesai, sebelum mulai lebih sedikit. Anda mungkin memeriksa, apakah Anda memiliki penundaan konstan 1s atau mungkin lebih, tergantung pada output atau tidak.

Saya kira keterlambatan 1s Anda memiliki alasan yang berbeda, mungkin HDD akan tidur dan perlu bangun?

Apakah Anda memiliki penundaan untuk beberapa file juga?

Pengguna tidak diketahui
sumber
Terima kasih tetapi saya tidak mencari sesuatu seperti itu. Sama seperti head yang kurang dieksekusi dengan hasil dari seluruh lshasil. Saya sedang mencari cara untuk membatasi hasil qty.
AndreDurao
@AndreDurao: Memindahkan komentar saya menjadi jawabannya.
pengguna tidak diketahui
0
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail
Abhishek
sumber
Maaf Abhishek, tapi inti dari pertanyaan ini adalah untuk memanfaatkan lsperintah di bash. Pipa perintah seperti grep, head, tailatau orang lain dieksekusi setelahls
AndreDurao
0
$ cut -f 1,n filename

akan melakukan tugas mengambil nfile pertama . nadalah jumlah file yang ingin Anda ekstrak. jadi kode yang lengkap adalah:

$ ls|cut -f 1,n file
Ramandeep Singh
sumber
1
The ls | cut -f 1,n fileperintah Anda disarankan akan output field pertama dan n pada setiap baris teks di file, dan akan benar-benar mengabaikan output ls. Ini tidak melakukan apa yang dibutuhkan poster asli.
telcoM
Ya Anda benar. Hanya koreksi membuatnya ls | kepala-n ... Ini pasti akan melakukan tugas.
Ramandeep Singh