Bagaimana saya bisa menggunakan penghitung kata (wc
) dan pemipaan untuk menghitung berapa banyak file atau direktori di /usr/bin
direktori?
Jawaban yang Diterima:
Salah satu pendekatan adalah dengan menggunakan ls
untuk memberi kami daftar file, tetapi kami ingin daftar ini dijamin hanya menampilkan 1 file atau direktori per baris. -1
switch akan melakukan ini untuk kita.
$ ls -1
dir1
dir2
dir3
fileA
fileB
fileC
Contoh
Buat contoh data di atas dalam direktori kosong.
$ mkdir dir{1..3}
$ touch file{A..C}
Periksa:
$ ls
dir1 dir2 dir3 fileA fileB fileC
Sekarang untuk menghitung Anda dapat menggunakan wc -l
untuk menghitung jumlah baris, yang sesuai dengan file atau direktori di ls -1
keluaran.
$ ls -1 | wc -l
6
(Namun perhatikan bahwa itu tidak termasuk file tersembunyi)
Menghitung file atau direktori, hanya saja tidak bersamaan
Untuk menghitung file atau direktori, Anda perlu sedikit mengubah taktik Anda. Dalam hal ini saya akan menggunakan ls -l
karena ini menunjukkan apa itu direktori dan apa itu file.
Contoh
$ ls -l
total 12
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir1
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir2
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir3
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileA
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileB
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileC
Kemudian kita dapat menggunakan grep
untuk memfilter direktori atau bukan direktori seperti:
# directories
$ ls -l | grep "^d"
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir1
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir2
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir3
# regular files
$ ls -l | grep "^-"
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileA
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileB
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileC
Sekarang cukup gunakan wc -l
lagi untuk menghitung di atas:
# directories
$ ls -l | grep "^d" | wc -l
3
# regular files
$ ls -l | grep "^-" | wc -l
3
Padahal, Anda dapat menghindari wc
sama sekali, dan gunakan grep
-c
pilihan:
$ ls -l | grep -c '^d'
(sekali lagi, file tersembunyi tidak disertakan. Perhatikan bahwa direktori dan reguler adalah dua jenis file. Ada banyak lagi seperti pipa bernama, tautan simbolik, perangkat, soket…).
Rekursi
Jika Anda perlu menemukan file dan direktori secara rekursif di bawah /usr/bin
maka Anda mungkin ingin mengubah taktik sepenuhnya dan menggunakan alat lain yang disebut find
.
Contoh
$ find /usr/bin | wc -l
4632
(meskipun di atas /usr/bin
sendiri termasuk dalam hitungan)
Teknik yang sama yang saya gunakan di atas dapat digunakan menggunakan ls
untuk melakukan sesuatu yang serupa tetapi ls
umumnya bukan alat yang baik untuk mengurai output. find
di sisi lain dibuat untuk ini, dan menawarkan sakelar untuk menemukan file atau direktori.
# find files
$ find /usr/bin -type f
# find directories
$ find /usr/bin -type d
(perhatikan bahwa kali ini, find
termasuk file tersembunyi (kecuali .
dan ..
)).
baris baru?
Saya tidak pernah tahu mengapa karakter baris baru adalah karakter legal untuk digunakan saat membuat nama file atau nama direktori. Jadi metode yang dibahas di atas menggunakan wc
dan ls
tidak akan menentang ini, jadi gunakanlah dengan mempertimbangkan hal itu.
Contoh
Buat direktori &nama file dengan baris baru.
$ mkdir $'dir4n5'
$ touch $'fileDnE'
ls
menunjukkannya dengan benar:
$ ls -1
dir1
dir2
dir3
dir4?5
fileA
fileB
fileC
fileD?E
Tapi wc
menghitung direktori dan file yang berisi baris baru sebagai 2 item, bukan satu.
$ ls -1 | wc -l
10
Salah satu metode untuk menyiasatinya, jika menggunakan implementasi GNU dari find
adalah menggunakan find
kemampuan untuk mencetak sesuatu yang lain di tempat setiap file yang ditemukan dan kemudian menghitungnya sebagai gantinya.
Contoh
$ find . -printf . | wc -c
9
Di sini kami menemukan semuanya di direktori saat ini (kecuali ..
), dan mencetak titik (.
) untuk masing-masing, dan kemudian menghitung titik menggunakan wc
kemampuan untuk menghitung byte alih-alih baris, wc -c
.
Referensi
- bash – Apa cara terbaik untuk menghitung hasil pencarian?