Ví dụ, tôi có một tập tin myold_file
. Sau đó, tôi sử dụng ln
để tạo một liên kết cứng như mylink
:
ln myold_file mylink
Sau đó, ngay cả bằng cách sử dụng ls -a
, tôi không thể biết đó là cái cũ.
Có cách nào để nói không?
Ví dụ, tôi có một tập tin myold_file
. Sau đó, tôi sử dụng ln
để tạo một liên kết cứng như mylink
:
ln myold_file mylink
Sau đó, ngay cả bằng cách sử dụng ls -a
, tôi không thể biết đó là cái cũ.
Có cách nào để nói không?
Câu trả lời:
Bạn không thể, bởi vì chúng thực sự là cùng một tệp, chỉ được tiếp cận bởi các đường dẫn khác nhau. Người đầu tiên không có tình trạng đặc biệt.
.bashrc
là một tệp chứa ..." khi chúng ta muốn nói, "đường dẫn tương đối .bashrc
đề cập đến một tệp chứa ...", đây là một sự kết hợp phổ biến của các danh mục và chúng ta nên hiểu rằng bất cứ khi nào chúng ta đề cập đến một đường dẫn hoặc một mục nhập thư mục "là" một tệp, chúng tôi muốn nói đến tệp mà nó đề cập đến. Với sự hiểu biết đó, hai liên kết cứng có thể "là" cùng một tệp. Từ chối quy ước đó có lợi cho ngôn ngữ chính thức, họ không thể. Cả hai tư thế đều có vị trí của họ :-)
Không có cách trực tiếp, sạch sẽ (đáng tin cậy) để làm điều đó. Nhưng trong những trường hợp thích hợp, điều này có thể xảy ra (hoặc ít nhất là có thể xảy ra). Vấn đề là có hai liên kết cứng nhưng chỉ có một tệp. Thay đổi, sửa đổi và (có thể) thời gian tạo chỉ được lưu trữ cho các tệp (inodes) nhưng không dành cho các mục nhập thư mục (các liên kết cứng). Do đó, thông tin bạn muốn có thể được lấy từ các hiệu ứng phụ chỉ có thể dễ dàng bị phá hủy bởi các hoạt động không liên quan đến tệp. Và bạn thậm chí không thể xem liệu nó đã bị phá hủy. Bạn chỉ có thể biết rằng từ hoàn cảnh hoạt động nếu bạn nhận thức chính xác về chúng.
Việc tạo ra một liên kết cứng là một hoạt động ghi vào thư mục chứa liên kết. Vì vậy, nó cập nhật các thư mục mtime
. Vì vậy, nếu
các liên kết nằm trong các thư mục khác nhau
và bạn biết rằng không có thư mục nào trong số này đã bị thay đổi (tệp được thêm, xóa, đổi tên hoặc thay đổi siêu dữ liệu tệp) sau khi liên kết cứng thứ hai được tạo, sau đó bạn có thể chỉ cần so sánh mtime
s của các thư mục.
Trường hợp đặc biệt: Nếu một trong các thư mục có mtime
trước tệp (inode) mtime
và bạn có thể chắc chắn chắc chắn rằng tệp không được ghi muộn hơn một lát sau khi tạo thì liên kết của thư mục này là liên kết cũ hơn.
Nếu các liên kết nằm trong cùng một thư mục (dường như là trường hợp trong câu hỏi của bạn) thì nó sẽ trở nên tồi tệ hơn. Sau đó, bạn có thể sử dụng
ls -lU
để có được một ấn tượng về thứ tự mà các mục đã được tạo. Điều đó không cần phải đúng thứ tự vì các mục có thể bị xóa để các mục mới được thực hiện ở giữa danh sách thư mục. Và như Gilles đã chỉ ra rằng nó hoàn toàn không hoạt động với các hệ thống tập tin mới hơn.
ls -lU
thủ thuật sẽ không hoạt động trên các hệ thống tập tin hiện đại (ext4, btrfs, zfs), có các mục không hiển thị theo thứ tự tạo nào cả.
rm myold_file
thì mylink
vẫn tồn tại và hoạt động hoàn hảo, vì đó là một mục tốt tương đương đề cập đến cùng một nút inode. Chỉ khi cả hai đã bị xóa, hệ thống mới có thể loại bỏ inode. Khi liên kết cứng đã được sử dụng để tạo hai mục hệ thống tệp tham chiếu đến cùng một tệp, chúng tương đương nhau. (Lưu ý rằng "tệp" ở đây có nghĩa là "một nút giữ dữ liệu cho một tệp, trái ngược với một thư mục). Xem: en.wikipedia.org/wiki/Inode
Nếu bạn dựa vào thời gian sửa đổi cuối cùng của các thư mục và bạn không có kiến thức về cách thức và thời điểm các thư mục đó được thay đổi, việc dựa vào mtime sẽ khiến bạn bị sai một phần trăm thời gian. Vấn đề ở đây là tập tin được thể hiện trong hệ thống tập tin bằng một nút, chứ không phải bởi một mục nhập thư mục. Mục nhập thư mục (tên tệp) trỏ đến nút, không phải tệp.
Tôi nghĩ rằng tôi đang thực hiện một số thông tin về lý do tại sao tôi cần biết mục nhập thư mục nào cũ hơn và làm thế nào để tránh cần phải biết điều đó.
Tôi nghĩ rằng câu hỏi này (khá hợp lý) đã sai lầm về việc một liên kết cứng thực sự là gì. Tôi nghĩ tuy nhiên câu trả lời trực tiếp chính xác nhất là 'Cả hai đều như vậy' .
Các hệ thống tệp Unix thường lưu trữ nội dung và dữ liệu tệp thực tế trong các nút i, chúng không có đường dẫn nào, các đường dẫn sau đó có nhiều mối quan hệ với các nút i này. Giống như một người đi theo hai tên, Bob và Joe. Người ta không thể nói rằng Bob già hơn Joe hoặc ngược lại, họ chỉ là tên của cùng một người.
Nếu bạn muốn giữ lại khái niệm về tệp 'gốc' và một tệp mới mà bạn có thể đang tìm kiếm một liên kết tượng trưng thay vào đó, thì đây là nhiều bí danh, chỉ là một hướng dẫn cho HĐH mà nó sẽ hoạt động theo một đường dẫn như thể chúng là cái khác mà không thay đổi cấu trúc tập tin bên dưới. (bạn có thể thực hiện những điều này với "liên kết tệp ln -s".
Mấu chốt của câu trả lời được đưa ra bởi một số người khác ở trên là mỗi tên tệp là một liên kết cứng đến một tệp. Không có bản gốc thực sự, chỉ có thể là một bản đầu tiên.
Hãy nghĩ về một thư mục như một bảng liệt kê tên tệp và số inode.
Mỗi liên kết cứng, bao gồm cả liên kết đầu tiên, là một mục trong thư mục gán "tên tệp" cho số inode, để bạn có thể truy cập tệp theo tên đó.
Tệp này là một tập hợp các khối trên đĩa, được quản lý và theo dõi bởi dữ liệu meta được lưu trữ trong một nút. Một tập tin có một số inode.
Truy cập dữ liệu của tệp thông qua tên tệp là một quá trình gồm ba bước: Tên tệp được tra cứu trong thư mục để lấy số inode. Sau đó, inode được gọi để tìm khối đĩa (hoặc khối) có liên quan chứa dữ liệu. Sau đó, cuối cùng những khối đó được đọc / viết.
Vì vậy, mang về nhà từ tất cả những gì về cơ bản là thế này: Hoàn toàn không có sự khác biệt giữa việc truy cập nội dung tệp bằng cách sử dụng đầu tiên ("bản gốc") hoặc bất kỳ liên kết cứng nào được tạo sau đó.
ls > a; ln a b; rm a; ln b c
, cái nào "nguyên bản" hơn cái kia?a
đã biến mất, bạn chỉ còn lạib
vàc
...