Bisakah saya menentukan jumlah sub-direktori dalam direktori menggunakan `ls -l`?


8

Saat menampilkan direktori menggunakan ls -l, jumlah tautan mereka (bidang kedua dalam output) setidaknya dua: satu untuk nama dir dan satu untuk.

$ mkdir foo
$ ls -l
total 2
drwxr-xr-x  2 user   wheel  512  4 oct 14:02 foo

Apakah aman untuk selalu menganggap bahwa jumlah tautan di atas 2 sesuai dengan jumlah subdirektori dalam direktori ini ( ..tautan)?

Jawaban:


7

Hal ini biasanya benar pada sistem unix bahwa jumlah link ke direktori adalah jumlah subdirektori ditambah 2. Namun ada kasus di mana ini tidak benar:

  • Beberapa kesatuan memungkinkan tautan keras ke direktori. Maka akan ada lebih dari 2 tautan yang tidak sesuai dengan subdirektori.

  • Ada filesystem di mana direktori tidak memiliki entri untuk .dan ... The GNU menemukan petunjuk menyebutkan beberapa contoh dalam pembahasan nya -noleafpilihan (yang menonaktifkan optimasi yang mengasumsikan bahwa .dan ..ada di semua direktori): “CD-ROM atau MS-DOS filesystem atau volume AFS mount point”

Cara yang hampir dapat diandalkan untuk menghitung jumlah subdirektori (masih mungkin gagal jika nama file berisi karakter baris baru) adalah

$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)

Cara yang lebih dapat diandalkan menggunakan gumpalan shell */dan .*/; seperti biasa menangani case di mana polanya tidak cocok sedikit menyusahkan (kecuali dalam bash dan zsh di mana Anda dapat mengaktifkan nullglobopsi).


2

Berikut ini cara lain untuk menghitung subdirektori (non-rekursif) di Bash:

(
shopt -s nullglob dotglob
printf '%s\000' */ | tr -dc '\0' | wc -c  # wc counts null bytes
)

Karena setiap nama file diakhiri oleh karakter ASCII NUL, ini harus berfungsi dengan benar bahkan jika nama file berisi karakter baris baru.



1

Saya tidak dapat menemukan apa pun di dokumentasi yang mengonfirmasi bahwa jumlah tautan akan selalu +2 pada jumlah subdirektori.

Tetapi, untuk menemukan jumlah yang benar, gunakan:

find . -type d -mindepth 1  -maxdepth 1 | wc -l

Atau jika Anda harus menggunakan ls -l, lihat jawaban yang lain.


Saya pikir Anda maksud -type d, tetapi: 1. ini membutuhkan GNU find; 2. Anda perlu mengurangi 1 untuk direktori awal (atau lulus -mindepth 1).
Gilles 'SO- stop being evil'

0

Jangan gunakan lsuntuk ini . Inilah salah satu cara yang berfungsi dengan semua nama file, bahkan yang berisi baris baru, karena hanya mencetak karakter baris baru alih-alih nama file:

find . -mindepth 1 -maxdepth 1 -type d -printf '\n' | wc -l

Sunting: Versi saat ini tidak menghasilkan peringatan apa pun, karena -mindepthdan -maxdepthharus sebelum -type(pohon direktori dipangkas sebelum memeriksa direktori, untuk menghemat waktu).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.