Jika Anda berdiri diam di lorong-lorong Unix & Linux dan mendengarkan dengan seksama, Anda akan mendengar suara hantu, meratap sedih, "Bagaimana dengan nama file yang mengandung baris baru?"
ls -d *snp* | wc -l
atau, secara setara ,
printf "%s\n" *snp* | wc -l
akan menampilkan semua nama file yang berisi snp, masing-masing diikuti oleh baris baru,
tetapi juga termasuk baris baru dalam nama file , dan kemudian menghitung jumlah baris dalam output. Jika ada file yang namanya
f o o
s n p \n
b a r
. t s v
maka nama itu akan ditulis sebagai
foosnp
bar.tsv
yang, tentu saja, akan dihitung sebagai dua baris.
Ada beberapa alternatif yang lebih baik dalam setidaknya beberapa kasus:
printf "%s\n" * | grep -c snp
yang menghitung garis yang berisi snp, jadi foosnp(\n)bar.tsvcontoh dari di atas hanya dihitung satu kali. Sedikit variasi dalam hal ini adalah
ls -f | grep -c snp
Dua perintah di atas berbeda karena:
- Ini
ls -fakan mencakup file yang namanya dimulai dengan .; yang printf … *tidak, kecuali dotglobopsi shell diatur.
printfadalah shell builtin; lsadalah perintah eksternal. Oleh karena itu, lsmungkin menggunakan sumber daya sedikit lebih.
- Ketika shell memproses a
*, ia mengurutkan nama file;
ls -ftidak mengurutkan nama file. Oleh karena itu, lsmungkin menggunakan sumber daya sedikit lebih sedikit.
Tetapi mereka memiliki sesuatu yang sama: mereka berdua akan memberikan hasil yang salah di hadapan nama file yang mengandung baris baru dan memiliki snpkeduanya sebelum dan sesudah baris baru .
Lain:
filenamelist=(*snp*)
echo ${#filenamelist[@]}
Ini membuat variabel array shell yang mencantumkan semua nama file yang berisi snp, dan kemudian melaporkan jumlah elemen dalam array. Nama file diperlakukan sebagai string, bukan baris, jadi baris baru yang disematkan tidak menjadi masalah. Bisa dibayangkan bahwa pendekatan ini dapat memiliki masalah jika direktori sangat besar, karena daftar nama file harus disimpan dalam memori shell.
Lagi:
Sebelumnya, ketika kami mengatakan printf "%s\n" *snp*, printfperintah mengulang (menggunakan kembali) "%s\n"format string sekali untuk setiap argumen dalam perluasan *snp*. Di sini, kami membuat perubahan kecil dalam hal itu:
printf "%.0s\n" *snp* | wc -l
Ini akan mengulang (menggunakan kembali) "%.0s\n"format string sekali untuk setiap argumen dalam perluasan *snp*. Tetapi "%.0s"berarti untuk mencetak nol karakter pertama dari setiap string - yaitu, tidak ada. Ini printfperintah akan menampilkan hanya baris baru (yaitu, baris kosong) untuk setiap file yang berisi snpnamanya; dan kemudian wc -lakan menghitungnya. Dan, sekali lagi, Anda dapat memasukkan .file dengan pengaturan dotglob.