Setiap direktori pada sistem Unix (dan mungkin juga setiap sistem lainnya) mengandung setidaknya dua entri direktori. Ini adalah .
(direktori saat ini) dan ..
(direktori induk). Dalam kasus direktori root, ini menunjuk ke tempat yang sama, tetapi dengan direktori lain, mereka berbeda. Anda bisa melihatnya sendiri menggunakan perintah stat
, pwd
dan cd
(di Linux):
$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 548865 Links: 2
Device: 802h/2050d Inode: 2670593 Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$
Perhatikan itu bin
dan sbin
masing - masing memiliki dua tautan ke sana. Satu adalah entri direktori di direktori root, dan yang lainnya adalah .
entri di dalam direktori itu.
Menggunakan ls
dengan pipa wc -l
adalah trik sederhana untuk menghitung jumlah garis dalam output ls '. Asumsinya adalah bahwa setiap file atau direktori akan menempati tepat satu baris dalam output. GNU akan, ketika outputnya adalah non-terminal, melakukan ini secara otomatis; yang lain mungkin perlu -1
opsi untuk mengaktifkan perilaku secara eksplisit. wc -l
hanya menghitung dan menampilkan jumlah baris ( -l
) pada inputnya.
Masalah dengan pendekatan itu adalah bahwa di Linux dan pada sistem file yang secara tradisional digunakan di Linux, nama file dan direktori (mereka benar-benar satu dan sama dalam hal ini) diperbolehkan mengandung karakter baris baru . Di hadapan mereka, salah satu metode berantakan - entri tersebut akan dihitung sebagai dua atau lebih entri ketika pada kenyataannya mereka adalah satu.
Selama Anda menggunakan GNU ls, tidak memiliki entri direktori dengan nama yang mengandung karakter baris baru, dan tidak memiliki alias aneh untuk ls
(misalnya, ls -a
), keduanya akan menampilkan jumlah file dan direktori dalam direktori saat ini (atau ditentukan). Bagi kebanyakan orang, ini cukup baik, tetapi tidak berlaku dalam kasus umum .
Jika Anda perlu menangani karakter yang tidak biasa (terutama baris baru) dalam nama entri direktori dengan benar, saya sarankan menggunakan -b
opsi ls untuk menghindarinya. ls -1bA
akan mencetak setiap nama entri direktori pada barisnya masing-masing, keluar dari karakter yang tidak biasa (sehingga setiap entri direktori akan terlihat sebagai satu), termasuk dotfiles dan -directories. Tack on wc -l
untuk baris perintah lengkap ls -1bA | wc -l
yang akan melaporkan jumlah file dan direktori di direktori saat ini (tetapi abaikan .
dan ..
; itulah perbedaan antara -a
dan -A
), tetapi tidak turun ke subdirektori mana pun. Jika Anda tidak ingin ada dotfile yang dihitung terhadap total, cukup abaikan -A
parameternya ls
.