Untuk keperluan pengujian, saya ingin menghitung berapa banyak file gambar di dalam direktori, memisahkan setiap jenis file gambar dengan ekstensi file (jpg = "yes". Ini karena nantinya akan berguna untuk skrip lain yang akan menjalankan suatu tindakan pada setiap ekstensi file). Dapatkah saya menggunakan sesuatu seperti berikut ini untuk file JPEG saja?
jpg=""
count=`ls -1 *.jpg 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo jpg files found: $count ; jpg="yes"
fi
Mengingat ekstensi file jpg, png, bmp, raw, dan lainnya, haruskah saya menggunakan while
siklus untuk melakukan ini?
sumber
JPG
danjpg
file, dan menginginkannya secara rekursif sehingga solusi saya adalah untuk menulisfind . -type f | awk -F . '{print tolower($NF)}' | sort | uniq -c | awk '{print $2,":",$1}'
Ini secara berulang menelusuri file dan menghitung ekstensi yang cocok:
sumber
sumber
find
. Juga, ini dapat membantu pembaca masa depan dari jawaban ini jika Anda memberikan penjelasan singkat tentang solusi Anda (jika mereka ingin memodifikasinya untuk kasus yang sedikit berbeda).find
default ke direktori saat ini, itulah cara saya menggunakan ini. Saya tidak berpikir Tuhan bermaksud nama file memiliki ruang di dalamnya, tetapi ini berfungsi dengan baik untuk kasus itu. Jika Anda memiliki baris baru, maka Anda layak mendapatkan semua yang Anda dapatkan. Saya memikirkan penjelasan tetapi memutuskan akan membuat jawaban terlalu lama, saya pikir kesederhanaan adalah yang terpenting. 99% dari kasus dalam 1% dari waktu. Ini mungkin kompatibel dengan Versi 7.Mungkin itu bisa menjadi lebih pendek
sumber
Apa pun yang terlibat
ls
kemungkinan akan menghasilkan hasil yang tidak terduga dengan karakter khusus (ruang dan simbol lainnya). Setiap bashism (seperti array) tidak portabel. Apa pun yang melibatkanwhile read
biasanya lambat.Di sisi lain,
find
SANGAT fleksibel (banyak opsi untuk difilter), ia memiliki [setidaknya] dua sintaks yang gagal aman untuk karakter khusus ... dan berskala baik pada direktori besar.Untuk contoh ini, saya telah digunakan
-iname
untuk mencocokkan nama ekstensi huruf besar dan kecil. Saya juga membatasi-maxdepth 1
untuk menghormati pertanyaan Anda "di direktori saat ini". Daripada menghitung jumlah baris, di mana nama file dapat menyertakan CR / LF,-print0
akan mencetak byte NULL pada akhir setiap nama file ... jadi| tr -d -c "\000" | wc -l
menghitung file dengan akurat (NULL bytes!).PS
-print0 | tr -d -c "\000" | wc -c
dapat diganti dengan-printf "\000" | wc -c
atau bahkan-printf '\n' | wc -l
.sumber
hanya dapat menggunakan ls untuk sesuatu IMO sederhana ini
atau
atau
sumber
Jika Anda yakin dengan ekstensi tersebut, Anda bisa menggunakan
find
likesumber
touch $'foo\nbar.jpeg
dan itu akan dihitung dua kali, bukan satu kali. Atau lebih buruk, seseorang melakukannyamkdir directory.jpeg; touch directory.jpeg/{1..100}.txt