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, pwddan 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 bindan sbinmasing - masing memiliki dua tautan ke sana. Satu adalah entri direktori di direktori root, dan yang lainnya adalah .entri di dalam direktori itu.
Menggunakan lsdengan pipa wc -ladalah 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 -1opsi untuk mengaktifkan perilaku secara eksplisit. wc -lhanya 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 -bopsi ls untuk menghindarinya. ls -1bAakan 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 -luntuk baris perintah lengkap ls -1bA | wc -lyang akan melaporkan jumlah file dan direktori di direktori saat ini (tetapi abaikan .dan ..; itulah perbedaan antara -adan -A), tetapi tidak turun ke subdirektori mana pun. Jika Anda tidak ingin ada dotfile yang dihitung terhadap total, cukup abaikan -Aparameternya ls.