Jika parsing output ls
berbahaya karena dapat merusak beberapa karakter yang funky (spasi \n
,, ...), apa cara terbaik untuk mengetahui jumlah file dalam direktori?
Saya biasanya mengandalkan find
untuk menghindari parsing ini, tetapi juga, find mydir | wc -l
akan rusak karena alasan yang sama.
Saya sedang mengerjakan Solaris saat ini, tetapi saya sedang mencari jawaban yang portabel seperti di berbagai kesatuan dan kulit yang berbeda.
find
akan memberi Anda jumlah file secara rekursif (gunakan-maxdepth 1
jika Anda tidak menginginkannya. Andafind mydir -maxdepth 1 -type f -printf \\n | wc -l
harus menangani karakter khusus dalam nama file, karena mereka tidak pernah dicetak sejak awal.Jawaban:
Bagaimana dengan trik ini?
Sebagai portabel seperti
find
danwc
.sumber
n+1
file di sistem Debian saya). Itu juga tidak memfilter untuk file biasa.find
perintah dengan kebutuhan spesifik Anda. Ya, ini termasuk semua direktori, termasuk.
(yang mungkin mengapa Anda melihat hasilnya sebagain+1
).find . -maxdepth 1 ! -name . -exec echo \; | wc -l
; beberapa versi yang lebih lamafind
tidak memiliki-not
.-maxdepth
tidak standar (ekstensi GNU sekarang juga didukung oleh beberapa implementasi lainnya).Dengan bash, tanpa utilitas eksternal, atau loop:
Di ksh, ganti
shopt -s dotglob
denganFIGNORE=.?(.)
. Di zsh, ganti dengansetopt glob_dots
, atau hapusshopt
panggilan dan gunakanfiles=(*(D))
. (Atau cukup hapus baris jika Anda tidak ingin menyertakan file dot.) Mudah-mudahan, jika Anda tidak peduli dengan file dot:Jika Anda ingin menyertakan file dot:
sumber
1
untuk direktori kosong ketikanullglob
tidak diaktifkan. Di zsh,a=(*(DN));echo ${#a}
dengan kualifikasiN
(nullglob
) tidak menghasilkan kesalahan untuk direktori kosong.Seharusnya cukup portabel untuk sistem pasca-80-an.
Itu menghitung semua entri direktori kecuali
.
dan..
di direktori saat ini.Untuk menghitung file dalam subdirektori juga:
(Yang itu harus portabel bahkan untuk Unix V6 (1975), karena tidak perlu
-prune
)sumber
find dirname ! -name dirname -prune -print
). Sejak itu saya bertanya-tanya apakah ada alasan khusus untuk digunakangrep -c /
sebagai penggantiwc -l
(yang mungkin lebih umum digunakan untuk menghitung).find dirname ! -name dirname
tidak berfungsi jika ada direktori lain di dalamnya yang dinamaidirname
. Lebih baik digunakanfind dirname/. ! -name .
.wc -l
menghitung jumlah baris, nama file dapat dibuat dari beberapa baris karena karakter baris baru sama validnya dengan nama file.Mencoba:
The
-b
akan memiliki karakter non-printable,-A
akan menampilkan semua file kecuali.
dan..
dan satu per baris (default pada pipa, tapi bagus untuk menjadi eksplisit).Selama kami menyertakan bahasa skrip tingkat tinggi, inilah satu-baris di Python:
Atau dengan 'temukan' lengkap:
sumber
Yoc dapat menggunakan konstruksi seperti itu:
Tapi saya khawatir, Anda dapat melakukan kesalahan seperti
Argument list too long.
jika Anda memiliki terlalu banyak file dalam direktori. Namun saya mengujinya di direktori dengan 10 miliar file, dan itu bekerja dengan baik.sumber
*
.gnu find . -maxdepth 1 -type f | wc -l
for
.Sudahkah Anda mempertimbangkan perl, yang seharusnya relatif portabel?
Sesuatu seperti:
sumber
Coba ini => Menggunakan ls dengan opsi -i (untuk nomor simpul) & -F (menambahkan nama direktori dengan opsi '/').
sumber
Dengan
perl
one-liner (diformat ulang agar mudah dibaca):atau
Anda dapat menggunakan
perl
fungsi yang memodifikasi array sepertigrep
ataumap
dengan versi kedua. Lihatperldoc -f readdir
contoh menggunakangrep
.sumber
Versi paling sederhana yang saya gunakan sepanjang waktu dan tidak pernah bermasalah adalah:
ls -b1 | wc -l
sumber
\n
karakter funky atau lainnya (yeah, beberapa tertentu mengizinkan ini).Selain
find
jawaban berbasis yang diajukan oleh Stéphane , berikut adalah jawaban yang sesuai dengan POSIX berdasarkanls
:sumber