Saya mendapatkan kesalahan berikut ketika mencoba ke ls *.txt | wc -l
direktori yang berisi banyak file:
-bash: /bin/ls: Argument list too long
Apakah ambang batas "Daftar argumen" ini bergantung pada distro atau spesifikasi komputer? Biasanya, saya akan mengirim hasil besar seperti itu ke beberapa perintah lain ( wc -l
misalnya), jadi saya tidak peduli dengan batas terminal.
ls
, yang merupakan ide yang buruk, jadi lebih baik menghindarinya. Untuk menghitung lihat Apa cara terbaik untuk menghitung jumlah file dalam direktori? , untuk solusi yang rumit, lihat mengapa loop tidak menimbulkan kesalahan "argumen terlalu lama"? .Jawaban:
Pesan kesalahan Anda daftar argumen terlalu lama berasal dari * dari
ls *.txt
.Batasan ini adalah keamanan untuk program biner dan Kernel Anda. Anda akan melihat pada halaman ini informasi lebih lanjut tentang itu, dan bagaimana itu digunakan dan dihitung.
Tidak ada batasan ukuran pipa. Jadi, Anda cukup mengeluarkan perintah ini:
NB: Di Linux modern, karakter aneh dalam nama file (seperti baris baru) akan lolos dengan alat seperti
ls
ataufind
, tetapi masih ditampilkan dari * . Jika Anda menggunakan Unix lama, Anda akan memerlukan perintah iniNB2: Saya bertanya-tanya bagaimana seseorang dapat membuat file dengan baris baru dalam namanya. Tidak sulit, setelah Anda tahu caranya:
sumber
-maxdepth 1
jika Anda tidak bermaksud menghitung file dalam subdirektori.-exec echo \;
.find
. Padafind
OS X dan pada sistem berbasis busybox, dan saya kira setiap sistem berbasis BSD menunjukkan nama file dengan baris baru di dalamnya, yang akan mengacaukan hitungan.wc -l
sedang menghitung baris baru. Jadi kami ingin memiliki baris baru.Ini terutama tergantung pada versi kernel Linux Anda.
Anda harus dapat melihat batas untuk sistem Anda dengan menjalankan
yang memberitahu Anda jumlah byte maksimum yang bisa dimiliki oleh baris perintah setelah diperluas oleh shell.
Di Linux <2.6.23, batasnya biasanya 128 KB.
Di Linux> = 2.6.25, batasnya adalah 128 KB, atau 1/4 dari ukuran tumpukan Anda (lihat
ulimit -s
), mana yang lebih besar.Lihat halaman manual execve (2) untuk semua detailnya.
Sayangnya, perpipaan
ls *.txt
tidak akan memperbaiki masalah, karena batasnya ada di sistem operasi, bukan shell.Shell memperluas
*.txt
, lalu mencoba menelepondan Anda memiliki banyak file yang cocok
*.txt
sehingga Anda melebihi batas 128 KB.Anda harus melakukan sesuatu seperti
sebagai gantinya.
(Dan lihat komentar Shawn J. Goff di bawah ini tentang nama file yang berisi baris baru.)
sumber
.
dan apa-maxdepth 1
artinya di baris terakhir? Terima kasih! : D.
berarti direktori saat ini,-maxdepth 1
berarti direktori tersebut tidak terlihat di subdirektori. Ini dimaksudkan agar sesuai dengan file yang sama dengan*.txt
.Solusi lain:
Meskipun
ls
menghasilkan lebih banyak output daripadals *.txt
menghasilkan (atau upaya untuk menghasilkan), itu tidak mengalami masalah "argumen terlalu lama", karena Anda tidak meneruskan argumen apa punls
. Perhatikan bahwagrep
mengambil ekspresi reguler daripada pola pencocokan file.Anda mungkin ingin menggunakan:
(dengan asumsi versi Anda
ls
mendukung opsi ini). Ini memberitahu Andals
untuk tidak mengurutkan outputnya, yang dapat menghemat waktu dan memori - dan dalam hal ini urutannya tidak masalah, karena Anda hanya menghitung file. Sumber daya yang dihabiskan untuk menyortir output biasanya tidak signifikan, tetapi dalam hal ini kami sudah tahu Anda memiliki jumlah*.txt
file yang sangat besar .Dan Anda harus mempertimbangkan mengatur ulang file Anda sehingga Anda tidak memiliki begitu banyak dalam satu direktori. Ini mungkin atau mungkin tidak layak.
sumber
MAX_ARG_PAGES tampaknya merupakan parameter kernel. Menggunakan
find
danxargs
merupakan kombinasi khas untuk mengatasi batas ini, tetapi saya tidak yakin itu akan berhasilwc
.Memipipkan output
find . -name \*\.txt
ke file dan menghitung baris dalam file itu harus berfungsi sebagai solusi.sumber
ls
output, tidak akan menyelesaikan ini. Selama * .txt wildcard diperluas melebihi batas, akan gagal bahkan sebelum memulails
dan menghasilkan output apa pun.ls
Anda harus menentukan-maxdepth 1
untuk menghindari pemindaian subdirektori secara rekursif.Ini mungkin kotor tetapi berfungsi untuk kebutuhan saya dan dalam kompetensi saya. Saya tidak berpikir itu berkinerja sangat cepat tetapi memungkinkan saya untuk melanjutkan hari saya.
Saya mendapatkan daftar panjang 90.000 jpg dan mengirimkannya ke avconv untuk menghasilkan timelapse.
Saya sebelumnya menggunakan ls * .jpg | avconv sebelum saya mengalami masalah ini.
sumber