Số giữa quyền và tập tin trong đầu ra lệnh ls -l là gì?


35

Đầu ra của ls -llệnh mang lại kết quả như sau:

nhập mô tả hình ảnh ở đây

Trường số giữa quyền và tập tin chủ sở hữu là gì? tức là những gì 1, 1, 1 và 2 là gì? Tôi đã kiểm tra --helpnhưng điều đó không giải thích nó.

[EDIT] Tôi nghĩ rằng đó là số lượng tệp trong một thư mục nhưng không phải vậy. Xem hình ảnh. "tempFolder" có 3 tệp nhưng vẫn hiển thị "2"

Câu trả lời:


33

Lưu ý: được chỉnh sửa sau khi bình luận @StephaneChazelas

Số đầu tiên của ls -lđầu ra sau khối cấp phép là số lượng liên kết cứng .

Nó có cùng giá trị với giá trị được trả về bởi statlệnh trong "Liên kết".

Số này là số lượng liên kết cứng của tệp, khi đề cập đến một tệp hoặc số lượng mục nhập thư mục chứa, khi đề cập đến một thư mục.

Một tệp thường có số lượng liên kết cứng là 1 nhưng điều này thay đổi nếu liên kết cứng được thực hiện bằng lnlệnh. Xem hướng dẫn tham khảo Debian .

Trong ví dụ của bạn, việc thêm một liên kết cứng cho tempFile2 sẽ tăng số lượng liên kết của nó:

ln -l
ln tempFile2 tempHardLink
ln -l

Cả tempFile2tempHardLink sẽ có số lượng liên kết là 2.

Nếu bạn thực hiện tương tự với một liên kết tượng trưng ( ln -s tempFile2 tempSymLink), giá trị đếm sẽ không tăng.

Một thư mục sẽ có số lượng tối thiểu là 2 cho '.'(liên kết đến chính nó) và cho mục nhập trong thư mục mẹ của nó.

Trong ví dụ của bạn, nếu bạn muốn tăng số lượng liên kết của tempFolder , hãy tạo một thư mục mới và số lượng sẽ tăng lên.

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

Liên kết từ AnotherFolder / đến tempFolder / (đó là ..) sẽ được thêm vào số đếm.



Vì nó được hiển thị giữa các quyền và quyền sở hữu, bạn có ấn tượng rất quan trọng, nhưng tôi không bao giờ sử dụng nó. Khi nào nó thường cần thiết?
Emanuel Berg

1
Điều đó không chính xác. Đó là số lượng liên kết, thời gian. Đối với các thư mục, bạn đã có 2 cho mục nhập trong thư mục mẹ của nó (giống như bất kỳ tệp nào) và .mục nhập trong chính nó, cộng với một cho các ..mục trong mỗi thư mục con của nó.
Stéphane Chazelas

@StephaneChazelas Tất cả các tài liệu tôi đã tìm thấy nói về số lượng liên kết cứng (ví dụ: linuxgazette.net/su35/tag/links.html ). Ngoài ra, tôi thấy rằng một câu hỏi tương tự đã được hỏi trong AskUbfox ( askubfox.com/questions/19510/ mẹo ). Tôi sẽ kiểm tra mã nguồn coreutils và xem liệu tôi có thể tìm ra câu trả lời chính xác không.
Damien

2
@EmanuelBerg khi các hệ thống tệp kém tin cậy hơn nhiều so với hiện tại và bạn đang làm việc trên hệ thống tệp bạn đã phát triển, lscó thể sử dụng 2 ký tự và cung cấp cho bạn thêm thông tin, và không có stat(1)lệnh nào cũng find(1)như fsck, cũng không phải là liên kết tượng trưng. hữu ích hơn ngày nay Nó không thể được thay đổi mà không phá vỡ các kịch bản shell mà các nhà văn của họ đã có từ lâu /dev/null; Nó đã được như vậy kể từ ít nhất là năm 1979.
msw

8

Trên Unix, thông thường, một tệp là một số mục trong bảng các tệp. Có nhiều loại tệp khác nhau: tệp thông thường, thiết bị, liên kết tượng trưng, ​​cửa ra vào, đường ống, ổ cắm, thư mục ...

Số inode (mà bạn có thể thấy trong đầu ra của ls -i) là chỉ mục trong bảng đó.

Bây giờ, bạn không truy cập các tệp bằng inode mà bằng đường dẫn . Một đường dẫn là một chuỗi các mục nhập thư mục. Bạn lưu ý chúng tôi không nói về thư mục nhưng các thư mục ở đây. Bởi vì đó là những gì một thư mục là (nghĩ về một thư mục điện thoại).

Thư mục là một loại tệp đặc biệt cung cấp tên cho một số nút. Một mục nhập thư mục là một ánh xạ từ một tên đến một nút.

Một tệp đã cho (một nút) có thể có nhiều tên trong một thư mục (giống như có thể có nhiều tên trong một số điện thoại) và cũng có thể có tên (mục) trong nhiều thư mục. Những liên kết được gọi là liên kết còn được gọi là liên kết cứng để phân biệt với liên kết mềm (một loại tệp đặc biệt là con trỏ tới đường dẫn).

Một tệp (inode) theo dõi số lượng liên kết (của các mục trong bất kỳ thư mục nào) mà nó có, do đó khi số này về 0 (khi nó được hủy liên kết từ thư mục cuối cùng, nó được tham chiếu).

Đó là số đó (số lượng liên kết) được hiển thị trong ls -lđầu ra.

Khi một tập tin không thư mục được tạo ra lần đầu tiên (với openhoặc creat(hoặc bindhoặc mknodcho một số loại file) các cuộc gọi hệ thống), nó được thực hiện bằng cách cung cấp với một đường dẫn đến tập tin mới (như "/a/b"). Điều xảy ra sau đó là một tệp mới và inode được phân bổ và một mục nhập mới được thêm vào thư mục được liên kết với "a"tên trong "/"thư mục gốc. Đó là liên kết ban đầu nên số lượng liên kết là một.

Nhiều liên kết có thể được thêm vào sau với lệnh link()gọi hệ thống ( lnlệnh). Và các liên kết có thể được gỡ bỏ bằng lệnh unlink()gọi hệ thống ( rmlệnh).

Bạn sẽ nhận thấy rằng các tệp của thư mục loại thường có số lượng liên kết lớn hơn hoặc bằng 2.

Bây giờ, khi bạn tạo một thư mục, bạn đang gọi cuộc gọi mkdir()hệ thống. Một cái gì đó như mkdir("/a/b"). Những gì nó làm sau đó là phân bổ một tệp mới của thư mục loại. Trong thư mục mới đó, nó tự động tạo hai mục:

  • "."( chấm cho thư mục ). Đó là một liên kết đến chính nó. Vì vậy, số lượng liên kết bây giờ là 1.
  • ".."(đối với thư mục của thư mục ). Đó là một liên kết đến "/a". Vì vậy, số lượng liên kết "/a"được tăng lên bởi một

Sau đó, thư mục mới đó được liên kết đến "/a"(một mục nhập được thêm vào "/a"cho nó), vì vậy số lượng liên kết của nó là 2. Nếu một "/a/b/c"thư mục được tạo, vì ".."mục nhập trong "/a/b/c", số lượng liên kết "/a/b"sẽ trở thành 3.

Hầu hết các Unice hạn chế tạo thêm các liên kết đến một thư mục vì chúng có thể gây ra các vòng lặp có vấn đề. Khi họ cho phép một link()thư mục, thông thường chỉ có siêu người dùng mới có thể làm điều đó.

Một số hệ thống tập tin như btrfskhởi hành từ cấu trúc thư mục truyền thống đó. Bạn sẽ nhận thấy rằng số lượng liên kết trên các thư mục trong btrfscác hệ thống tệp luôn luôn là một mặc dù các thư mục đó có chứa một "."mục có cùng số inode như chính chúng trong chúng.

Thực tế là số lượng liên kết theo truyền thống là 2 cộng với số lượng các thư mục con có công dụng của nó. Ví dụ: trong:

find . -name '*.c' -print

Nếu .không chứa các thư mục con nhưng chứa hàng triệu tệp. Bằng cách kiểm tra số lượng liên kết của ., findcó thể biết rằng không có subir. Vì vậy, tất cả findphải làm là đọc nội dung của thư mục và báo cáo các mục kết thúc .c(như một grep '\.c$'tệp trên một vài megabyte, không có vấn đề gì lớn). Nếu không, findsẽ phải kiểm tra loại của mỗi tệp duy nhất để xem liệu có thư mục nào đi xuống trong đó không (dẫn đến nhiều lstat()cuộc gọi hệ thống). Tất nhiên, loại tối ưu hóa này không hoạt động btrfs(mặc dù trong các phiên bản Linux hiện đại, loại tệp cũng được lưu trong mục nhập thư mục cho một số hệ thống tệp (bao gồm btrfs) và được trả về bởi lệnh getdents(2)gọi hệ thống được sử dụng để truy xuất danh sách các mục nhập trong một thư mục, vì vậylstat vẫn không cần thiết).


+1, câu trả lời tuyệt vời :) Bằng cách xem mã nguồn ls, tôi nhận thấy rằng số liên kết đã được cập nhật sau khi gọi đến stat. Vì vậy, lệnh stat sẽ cung cấp cho bạn giá trị của các liên kết cho một tệp hoặc thư mục.
Damien

Nó có nghĩa là gì -thay vì bất kỳ số nào ở vị trí sau khi quyền trong ls -lđầu ra?
Shubham
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.