Linux xử lý lệnh di chuyển như thế nào


12

Làm thế nào để linux xử lý một lệnh di chuyển dưới mui xe?

Hãy nói rằng tôi chuyển nhà của tôi

/home/me

và tôi chuyển nó vào một thư mục khác

/home/foo/me

Làm thế nào là tất cả các đường dẫn tập tin và thư mục theo methay đổi? Tôi biết Desktopthư mục của tôi mebây giờ /home/foo/me/Desktopcũng như Documents /home/foo/me/Documentsnhưng hệ thống tệp có cập nhật rõ ràng mọi đường dẫn bên dưới međể phản ánh sự thay đổi không? Điều đó không có vẻ rất hiệu quả và có lẽ không phải điều này.

Tôi có thể lấy thêm thông tin về vấn đề này ở đâu?


5
Về hiệu quả: không, điều đó sẽ không hiệu quả. Khi bạn di chuyển dữ liệu sang thư mục khác, dữ liệu không thực sự được đọc ở một nơi và được ghi ở nơi khác. Một hệ thống tệp chứa một tập hợp các con trỏ tới các khối dữ liệu. Trong trường hợp di chuyển, chỉ con trỏ được cập nhật.
Jos

À, đó có lẽ là ý của jeff ...
Jacob Vlijm

@Jos Đó là nơi phân mảnh đến từ phải không?
zero298

3
@ zero298 Không, phân mảnh nói chung là một isse hoàn toàn khác và không liên quan - phân mảnh không phải là về nội dung của cấu trúc thư mục, mà là về nội dung của một tệp được phân tán trong các đĩa đĩa vật lý (thay vì là một dòng liên tục duy nhất), giảm đọc / ghi hiệu suất của các tập tin đó. Nội dung của cây thư mục lớn / sâu / phân nhánh thường không được dự kiến ​​là liên tục và di chuyển theo cách đó.
Peteris

Câu trả lời:


21

Để hiểu cách nó di chuyển các thư mục, bạn có thể cần hiểu một chút về hệ thống tệp trong linux. Mỗi tệp và thư mục được lưu trữ như một phần của cấu trúc dữ liệu được gọi là " inode ". Mỗi tệp có một số inode, các thư mục cũng vậy.

Để xem inode của thư mục của bạn, sử dụng lệnh ls -ial foldername. Cột đầu tiên hiển thị số inode của tệp. Đối với mỗi thư mục có hai tên duy nhất ..., đại diện cho thư mục của riêng nó và thư mục mẹ tương ứng.

Bạn có thể thử thực hiện một thử nghiệm để di chuyển một thư mục (giả sử / home / me / source) với các thư mục con và tệp sang thư mục khác (ví dụ / home / me / where / other). Số inode của / home / me / source và tất cả nội dung của nó vẫn giữ nguyên trước và sau khi di chuyển. Sự khác biệt duy nhất là số inode của .., ban đầu chia sẻ số inode của / home / me và bây giờ trở thành số inode của / home / me / where / other. Nói một cách đơn giản, Linux cập nhật liên kết đến nguồn thư mục và thế là xong.

Nội dung trên đĩa cứng dù sao cũng không được sửa đổi, chỉ có chỉ số inode được cập nhật khi thư mục được di chuyển. Tất nhiên, đây không phải là trường hợp nếu bạn di chuyển thư mục đến một vị trí thực tế khác.


3
Phải, miễn là di chuyển không vượt qua ranh giới hệ thống tập tin.
kojiro

3

Nếu bạn quan tâm đến cách các chương trình như mvcphoạt động, hãy nhớ rằng chúng là nguồn mở và bạn có thể nhận được lời giải thích chính xác nhất bằng cách đọc qua mã. Ở đây có liên kết đến tất cả các tiện ích cốt lõi. Cụ thể, bạn có thể tìm thấy mv ở đây


6
you can get the most accurate explanation by reading through the code.Tôi có ý kiến ​​khác; Trong một thời gian dài, tôi hoàn toàn không có kinh nghiệm với C, và thậm chí bây giờ tôi không thích nó. Ngoài ra, mã nguồn thường được tối ưu hóa và chứa nhiều trường hợp cạnh hơn mức cần thiết. Một lời giải thích mang tính biểu tượng thường giúp nhiều hơn.
Shelvacu

1
@shelvacu "chứa nhiều trường hợp cạnh hơn mức cần thiết". Mã mạnh mẽ xử lý tất cả các trường hợp cạnh có thể có mặt. Tuy nhiên, sự thật là việc trình bày tất cả các trường hợp cạnh trong phần giải thích đầu tiên về một khái niệm có thể không cần thiết.
OregonTrail

@OrebTrail Xin lỗi, đó là điều tôi muốn nói, mã có nhiều trường hợp cạnh hơn sau đó là nhu cầu giải thích
Shelvacu

Tôi rất vui vì đó là tình cảm ban đầu của bạn, nhưng dường như bạn vẫn bỏ lỡ sự nhấn mạnh của tôi về " tay cầm ". Mã được viết tốt không trường hợp cạnh, nó xử lý các trường hợp cạnh. ;) Tôi biết bạn đến từ đúng nơi ở đây, nhưng bạn nên cẩn thận với động từ của mình.
OregonTrail
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.