Làm thế nào để biết tập tin nào là nguyên bản nếu liên kết cứng được tạo


34

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?


2
Truy vấn: Nếu bạn làm 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ại bc...
glglgl

2
Bạn đang cố gắng để đạt được điều gì? Bạn đang cố gắng để đạt được điều gì? Không có "bản gốc" như vậy. Một tệp là một nút chứa dữ liệu meta và một tập hợp các khối chứa dữ liệu. Một thư mục có thể chứa một liên kết đến tệp và liên kết này là tên tệp và số inode. Bạn có thể tạo bất kỳ số lượng liên kết đến một tập tin. Các tập tin có thể không bao giờ có ít hơn một liên kết.
Johan

Để được giải thích chi tiết về câu trả lời được chấp nhận của câu hỏi này: Xem câu trả lời được chấp nhận của câu hỏi đó .
Utku

Câu trả lời:


93

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.


4
Đây rõ ràng là câu trả lời đúng: câu hỏi của OP dựa trên sự hiểu lầm.
Daniel Earwicker

8
@Adnan Trên thực tế, không: hai liên kết cứng là cùng một tệp. Chúng là các mục thư mục khác nhau. Thuật ngữ của Jenny D là chính xác.
Gilles 'SO- ngừng trở nên xấu xa'

1
@Gilles Tôi không thấy nó có thể đúng như thế nào. Hai liên kết cứng không phải là hai tập tin ; liên kết cứng không tập tin. Họ trỏ , do đó liên kết , đến cùng một tệp (đó là vị trí vật lý trên đĩa). Nói rằng "hai liên kết cứng đúng nghĩa là cùng một tệp" là sai.
Adi

1
@JennyD Và đó là cách duy nhất tôi nghe thấy "liên kết cứng" được sử dụng; một con trỏ hệ thống tập tin đến một nút. Chà, tôi đoán tất cả chúng ta đều sai và đúng. Tôi sẽ ngừng tranh luận điều này là vô nghĩa. Câu trả lời của bạn có vẻ đúng với tôi, bạn có +1 từ tôi và tôi sẽ để nó ở đó.
Adi

5
Nói rằng một liên kết cứng "là" một tệp đang so sánh những thứ thuộc các loại khác nhau, về mặt kỹ thuật không chính xác. Nhưng do chúng ta thường nói, " .bashrclà 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ọ :-)
Steve Jessop

16

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

  1. các liên kết nằm trong các thư mục khác nhau

  2. 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 mtimes 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ó mtimetrước tệp (inode) mtimevà 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.


2
Không đề cập đến selinux, dấu vết kiểm toán hoặc gián điệp trên tạp chí hệ thống tập tin ??? nhếch mép Không có dấu vết kiểm toán, không có cách nào để biết - mọi thứ khác chỉ là phỏng đoán được
Ricky Beam

1
@mikeerv Nếu bạn muốn dạy người khác theo cách này thì ít nhất bạn nên học cách trích dẫn chính xác. Nó không nói "tập tin nào" trong câu hỏi. Và ngay cả khi nó đã làm thì đây sẽ chỉ là một vấn đề từ ngữ và ném một số bộ não để hiểu câu hỏi sẽ dễ dàng tiết lộ những gì nó thực sự là về.
Hauke ​​Laging

4
Thủ thuật mtime thư mục sẽ hoạt động nếu hoàn cảnh đúng (rất hiếm). Tuy nhiên, cách bạn trình bày nó, đôi khi bạn sẽ đi đến kết luận ngược lại. Thư mục mtime chỉ là một dấu hiệu đáng giá nếu nó bằng với thời gian của tệp. Nhưng ls -lUthủ 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ả.
Gilles 'SO- ngừng trở thành ác quỷ'

2
@mikeerv - Câu hỏi của OP dựa trên sự hiểu lầm. Nếu họ đã làm rm myold_filethì mylinkvẫ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
Daniel Earwicker

1
-1 bởi vì, mặc dù thông tin về cách thư mục thay đổi trong một số hệ thống tệp khi cập nhật các bảng, câu trả lời này không làm sáng tỏ sự hiểu sai trong câu hỏi rằng "tệp gốc" không phải là một thuộc tính trong trường hợp có nhiều liên kết cứng đến một nút đơn. Theo nghĩa đó, trong khi thú vị về giai thoại, đó không phải là điều mà hầu hết mọi người nhắm vào câu hỏi này nên tìm hiểu về khái niệm cơ bản của liên kết cứng. Vấn đề này không phải là thiếu "cách làm sạch trực tiếp", vấn đề là không có "nó" ngay từ đầu.
Caleb

10

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 đó.


8

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".


Bạn biết đấy, Bob / Joe có thể thực sự nhạy cảm về tuổi của mình ... So sánh liên kết cứng / mềm là một điều tốt - đặc biệt là khi bạn cho rằng một liên kết cứng sẽ chỉ có một mục được thêm vào tệp thư mục - đã có sẵn inode - nhưng liên kết mềm là một tệp theo đúng nghĩa của nó và do đó được gán inode rất riêng của nó. Tuy nhiên, trong cả hai trường hợp, thời gian sửa đổi chỉ liên quan đến tệp được liên kết, vì các sửa đổi duy nhất có thể được thực hiện đối với một liên kết có ý nghĩa quan trọng sẽ chỉ là tạo / xóa.
mikeerv

2

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 đó.

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.