Saya ingin menghitung jumlah total file dalam direktori tertentu yang berakhir dengan ekstensi ".mp4".
Saya mendapatkan perintah berikut:
ls -F |grep -v / | wc -l
Itu menghitung semua file dalam direktori tertentu, tetapi saya ingin jumlah file yang berakhir dengan ekstensi .mp4.
Apakah ada perintah Ubuntu untuk itu?
command-line
ls
Prakash V Holkar
sumber
sumber
ls -1
penanganan karakter baris baru, dalam hal ini, masuk akal untuk mengurails
output. Yang ditandai salah untuk penggunaan flag -R.Jawaban:
Di sini Anda bisa melakukannya dengan cara ini
Ini memberi Anda menghitung
sumber
-R
? Mengapa melakukan penuhstat
ketika Anda hanya membutuhkan nama file? Mengapa tidakls -1 *.jpg| wc -l
? (ok, tidak berfungsi jika Anda memiliki nama file dengan baris baru di dalamnya. Dalam hal ini Anda layak mendapatkannya ;-) ...).jpg
. Apakah Anda pernah mengujinya?*.jpg
diperluas oleh shell, bukan olehls
) dan jika ada file yang namanya dimulai dengan tanda hubung..
. Tapi itu benar-benar berfungsi dengan tanda hubung dalam nama, kecuali kapan/path/to/dir
string kosong atau jalur relatif dimulai dengan tanda hubung. Tapi saya salah sebelum mengatakanls
mengganti karakter dengan?
. Itu terjadi ketika stdout adalah terminal, tetapi di sini outputnya adalah sebuah pipa sehinggals
mengirim semua karakter dari nama file kewc
. Itu membuat jawaban ini salah tanpa tanda-q
atau-b
untuk mengubah perilaku itu , karena nama file dapat berisi baris baru. Jawaban l0b0 bebas dari masalah ini.Sayangnya masalah jinak ini sulit dipecahkan dengan cara yang mendukung semua nama file dan bersifat portabel. Ini aman (menangani file-file tersembunyi, jalur yang berisi spasi, tanda hubung dan bahkan baris baru)
dan kompatibel dengan POSIX:Jika Anda tidak ingin rekursif, cukup tambahkan
-maxdepth 1
.Anda tidak harus mengurai
ls
output.Uji:
Bandingkan dengan jawaban yang diterima :
Atau saran lain:
sumber
-printf x
sebagai gantinya-exec printf x \;
. Yaitu:find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c
Tidak perlu perintah-exec
eksternalprintf
, yang jika ada banyak file akan sangat lambat , karenafind
harus memotong (2) dari salinan dirinya sendiri dan kemudian mengeksekusi (2)/usr/bin/printf
. Dengan-exec printf x \;
, itu harus dilakukan satu kali untuk setiap file .-printf
tidak didukung dalam POSIXfind
, itulah sebabnya saya tidak menggunakannya.-mindepth
dan-maxdepth
, yang Anda gunakan.find
mengandung-mindepth
dan-maxdepth
tetapi tidak mengandung-printf
jadi saya sangat menghargai masuknya keduanya.Yang ini menemukan, mengurutkan, dan mendaftar semua file dengan ekstensi agar:
sumber
| sort -rn
di akhir dan mungkin-mindepth 1
jika hanya dir saat ini.head -n
untuk mendapatkan puncak n.Saya pikir ini sangat sederhana sebagai perintah berikut.
atau
Saya pikir perintah di atas menghitung jumlah file dan nama direktori
*.mp4
jadi saya sarankan Anda menggunakan
-type f
opsi sebagaifind
parameter sebagai berikut.Selain itu,
ls -lR
bisa digunakan sebagaifind .
sumber
Anda bisa menggunakannya
ls -1 *.mp4 | wc -l
.Ini akan mencantumkan semua file yang berakhir
.mp4
, mencetak setiap file pada baris baru (ls -1 *.mp4
), menyalurkan outputwc
yang akan menghitung jumlah baris baru menggunakan-l
bendera.sumber
*.mp4
diperluas oleh shell, tidakls
, ini akan gagal jika ada begitu banyak.mp4
file dalam direktori yang daftar mereka tidak dapat diteruskanls
sebagai argumen.--.mp4
--
akan menyelesaikan kasus kedua; yang pertama akan memunculkan pesan kesalahan (Anda perlu banyak file!) dan pertanyaan bagus lainnya di sini. Kasing sudut, tapi perlu diperhatikan, ya.-q
atau-b
, ini tidak mentolerir baris baru dalam nama file. Jika Anda larils -1 *.mp4
dari terminal Anda tanpa pipa,ls
lihat stdout -nya adalah terminal dan-q
sesuai dengan yang tersirat, pencetakan?
. Tapi perilaku itu hilang ketika output disalurkan.ls -1 *.mp4 | wc -l
overcounts jika ada baris baru.ls -1 *.mp4 | cat
menunjukkan apa yangwc
"dilihat." (Demikian pula,-1
tersirat ketika stdout bukan terminal, jadi itu opsional.)ls -1q -- *.mp4 | wc -l
Hampir berfungsi, tetapi tidak dengan nol .mp4 file.Ini akan memberi Anda daftar file dengan .mp4
Ketika dikombinasikan dengan
wc -l
akan memberi Anda menghitungjika Anda ingin mencari untuk menyertakan subdirektori
sumber
wc -l
ls /directory/*.mp4
menyebabkan shell memperluas glob dan menjalankan sesuatu sepertils /directory/file1.mp4 /directory/file2.mp4 ...
ini akan gagal jika direktori berisi lebih banyak file mp4 daripada yang bisa diteruskan sebagai argumenls
.Di bash, satu resor dingin menggunakan array dengan glob:
sumber
Ganti (.csv dengan ekstensi yang Anda inginkan)
Penjelasan: Saya pikir skema sederhana adalah mengambil daftar file, dan menghitung ekstensi dengan grep.
\.
untuk mencocokkan.
dan$
mencocokkan ekstensi di akhir baris. Ini berfungsi karena ketika output ls disalurkan, satu nama file dikirim per baris, yang dapat Anda verifikasi dengan menjalankan:sumber
grep --count
, Anda juga bisa menggunakangrep -c
.Lihat Bagaimana Cara Menghitung File Dengan Ekstensi Di Linux? , itu memberikan jawaban dan penjelasan yang baik, Anda dapat menggunakan perintah berikut:
sumber