Berapa nomor antara izin file dan pemilik dalam output perintah ls-l?


35

Output dari ls -lperintah menghasilkan hasil sebagai berikut:

masukkan deskripsi gambar di sini

Apa bidang angka antara izin file dan pemilik? yaitu apa itu 1, 1, 1, dan 2 ? Saya memeriksa --helptetapi itu tidak menjelaskannya.

[EDIT] Saya pikir itu adalah jumlah file dalam direktori tetapi tidak. Lihat gambar. "tempFolder" memiliki 3 file tetapi masih menunjukkan "2"

Jawaban:


33

Catatan: diedit setelah komentar @StephaneChazelas

Jumlah pertama dari ls -loutput setelah blok izin adalah jumlah tautan keras .

Ini adalah nilai yang sama dengan yang dikembalikan oleh statperintah di "Tautan".

Angka ini adalah jumlah hardlink file, ketika merujuk ke file, atau jumlah entri direktori yang terkandung, ketika merujuk ke direktori.

Sebuah file yang biasanya memiliki jumlah link keras dari 1 tapi ini berubah jika hard link yang dibuat dengan lnperintah. Lihat manual Referensi Debian .

Dalam contoh Anda, menambahkan tautan keras untuk tempFile2 akan meningkatkan jumlah tautannya:

ln -l
ln tempFile2 tempHardLink
ln -l

Baik tempFile2 dan tempHardLink akan memiliki jumlah tautan 2.

Jika Anda melakukan latihan yang sama dengan tautan simbolik ( ln -s tempFile2 tempSymLink), nilai hitungan tidak akan meningkat.

Sebuah direktori akan memiliki jumlah minimum 2 untuk '.'(link ke dirinya sendiri) dan untuk entri dalam direktori induknya.

Dalam contoh Anda, jika Anda ingin menambah jumlah tautan tempFolder , buat direktori baru dan angkanya akan naik.

ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder

Link dari anotherFolder / ke tempFolder / (yang ..) akan ditambahkan ke hitungan.



Karena ini ditampilkan antara izin dan kepemilikan, Anda mendapatkan kesan itu sangat penting, tetapi saya tidak pernah menggunakannya. Kapan biasanya dibutuhkan?
Emanuel Berg

1
Itu tidak benar. Ini adalah jumlah tautan, titik. Untuk direktori, Anda punya 2 untuk entri di direktori induknya (sama seperti file apa pun) dan .entri itu sendiri, ditambah satu untuk ..entri di masing-masing subdirnya.
Stéphane Chazelas

@StephaneChazelas Semua dokumentasi yang saya temukan berbicara tentang jumlah tautan keras (misalnya, linuxgazette.net/issue35/tag/links.html ). Saya juga menemukan bahwa pertanyaan serupa diajukan di AskUbuntu ( askubuntu.com/questions/19510/… ). Saya akan memeriksa kode sumber coreutils dan melihat apakah saya dapat menemukan jawaban yang tepat.
Damien

2
@ EmanuelBerg ketika sistem file jauh kurang dapat diandalkan daripada yang ada sekarang dan Anda bekerja pada sistem file yang Anda kembangkan, dan lsdapat menghabiskan 2 karakter dan memberi Anda lebih banyak informasi, dan tidak ada stat(1)perintah atau find(1)juga fsck, atau symlink mungkin jauh lebih banyak berguna daripada hari ini. Itu tidak dapat diubah tanpa merusak skrip shell yang penulisnya telah lama melewati /dev/null; Sudah seperti itu setidaknya sejak 1979.
msw

8

Pada Unix, biasanya, file adalah beberapa entri dalam daftar file. Ada berbagai jenis file: file biasa, perangkat, tautan simbolik, pintu, pipa, soket, direktori ...

Nomor inode (yang dapat Anda lihat di output ls -i) adalah indeks dalam tabel itu.

Sekarang, Anda tidak mengakses file dengan inode tetapi dengan path . Sebuah jalan adalah rantai direktori entri. Anda akan melihat kita tidak berbicara tentang folder tetapi direktori di sini. Karena itu adalah direktori (pikirkan direktori telepon).

Direktori adalah jenis file khusus yang memberi nama ke sejumlah inode. Entri direktori adalah pemetaan dari nama ke inode.

File yang diberikan (sebuah inode) dapat memiliki lebih dari satu nama dalam satu direktori (sama seperti ada lebih dari satu nama di nomor telepon), dan juga dapat memiliki nama (entri) di lebih dari satu direktori. Itu disebut tautan yang juga dikenal sebagai tautan keras untuk dibedakan dengan tautan lunak (jenis file khusus yang merupakan penunjuk jalan).

File (inode) melacak jumlah tautan (entri dalam direktori apa pun) yang dimilikinya, sehingga ketika jumlahnya mencapai 0 (ketika sedang diputuskan tautannya dari direktori terakhir yang direferensikan di dalamnya), ia tidak dialokasikan.

Itu angka itu (jumlah tautan) yang ditampilkan di ls -loutput.

Ketika file non-direktori dibuat pertama kali (dengan openatau creat(atau bindatau mknoduntuk beberapa jenis file) panggilan sistem), hal itu dilakukan dengan menyediakan dengan path ke file baru (seperti "/a/b"). Apa yang terjadi kemudian adalah file baru dan inode dialokasikan dan entri baru ditambahkan ke direktori yang terkait dengan "a"nama di "/"direktori root. Itulah tautan awal sehingga jumlah tautannya satu.

Lebih banyak tautan dapat ditambahkan nanti dengan link()system call ( lnperintah). Dan tautan bisa dihapus dengan unlink()system call ( rmperintah).

Anda akan melihat bahwa file-file dari direktori jenis umumnya memiliki jumlah tautan yang lebih besar atau sama dengan 2.

Sekarang, ketika Anda membuat direktori, Anda memanggil mkdir()panggilan sistem. Sesuatu seperti mkdir("/a/b"). Apa yang dilakukannya kemudian mengalokasikan file baru dari direktori tipe. Di direktori baru itu, secara otomatis membuat dua entri:

  • "."( titik untuk direktori ). Yang merupakan tautan ke dirinya sendiri. Jadi jumlah tautannya sekarang 1.
  • ".."(untuk direktori 's direktori ). Yang merupakan tautan ke "/a". Jadi jumlah tautan "/a"bertambah satu

Kemudian direktori baru itu ditautkan ke "/a"(entri ditambahkan "/a"untuk itu), sehingga jumlah tautannya sekarang 2. Jika "/a/b/c"direktori dibuat, karena ".."entri tersebut "/a/b/c", jumlah tautan "/a/b"akan menjadi 3.

Kebanyakan Unices membatasi pembuatan tautan lebih lanjut ke direktori karena mereka dapat menyebabkan loop bermasalah. Ketika mereka mengizinkan link()pada direktori, umumnya hanya superuser yang bisa melakukannya.

Beberapa sistem file suka btrfsbertolak dari struktur direktori tradisional itu. Anda akan melihat bahwa penghitungan tautan pada direktori dalam btrfssistem file selalu sama meskipun direktori tersebut memang berisi "."entri dengan nomor inode yang sama dengan yang ada di dalamnya.

Fakta bahwa penghitungan tautan secara tradisional 2 ditambah jumlah subdir telah digunakan. Misalnya, di:

find . -name '*.c' -print

Jika .tidak mengandung subdir tetapi mengandung jutaan file. Dengan memeriksa jumlah tautan ., finddapat diketahui bahwa tidak ada subdir. Jadi yang findharus dilakukan adalah membaca konten direktori dan melaporkan entri yang berakhir .c(seperti grep '\.c$'pada beberapa file megabyte, bukan masalah besar). Kalau tidak, findharus memeriksa jenis setiap file tunggal untuk melihat apakah ada direktori untuk turun di sana (menghasilkan banyak lstat()panggilan sistem). Tentu saja, optimasi semacam ini tidak berfungsi btrfs(walaupun dalam Linux versi modern, tipe file juga disimpan dalam entri direktori untuk beberapa sistem file (termasuk btrfs) dan dikembalikan oleh getdents(2)system call yang digunakan untuk mengambil daftar entri. dalam direktori, jadilstat masih tidak perlu).


+1, jawaban yang bagus :) Dengan melihat kode sumber ls, saya perhatikan bahwa nomor tautan diperbarui setelah panggilan ke stat. Jadi perintah stat akan memberi Anda nilai tautan untuk file atau direktori.
Damien

Apa artinya memiliki -alih - alih nomor apa pun di tempat setelah izin dalam ls -loutput?
Shubham
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.