Tại sao `cp` và` rm` xử lý các thư mục riêng biệt?


10

Tại sao các công cụ thích cprmxử lý các thư mục riêng biệt với các tệp thông thường? Cả hai đều yêu cầu người dùng chỉ định rõ ràng cô ấy muốn có hành vi đệ quy, nếu không họ sẽ không xử lý các thư mục.

Tương tác đầu tiên của tôi (một lúc trước) với các máy tính là trên môi trường Windows / GUI / point-and-click / kéo và thả, dường như luôn tự nhiên rằng các hoạt động này sẽ hoạt động giống nhau, bất kể mục tiêu là gì.

Hành vi này đặc biệt làm tôi thất vọng khi tôi ra lệnh bằng các ký tự đại diện. Điều gì xảy ra nếu tôi muốn xóa mọi thứ trong một thư mục ( *) ngoại trừ các thư mục con không trống ?

Tôi chỉ có thể tưởng tượng rằng đây là một tính năng bảo mật nào đó để ngăn người dùng tự bắn vào chân mình, nhưng điều này mâu thuẫn với sự hiểu biết của tôi về một vài nguyên tắc Unix:

  • Unix thường không bảo vệ người dùng khỏi chính mình. Nó luôn cho rằng người dùng biết cô ấy đang làm gì.
  • Đối với Unix mọi thứ là một tập tin. Không phải là một thư mục chỉ là một tập tin? Tại sao họ được đối xử khác nhau?

Những câu hỏi của tôi:

  • Là hành vi này xuất phát từ một giới hạn kỹ thuật hay nó là một sự lựa chọn có chủ ý?

Và trong trường hợp sau này,

  • Có tài khoản lịch sử nào về lý do thúc đẩy sự lựa chọn này không?

Đối với rmít nhất, nếu bạn muốn nó bỏ qua sự khác biệt giữa các tập tin và thư mục, bạn có thể đặt ở của bạn ~/.bashrctập tin: alias rm='rm -r'.
BenjiWiebe

1
Xem thêm câu hỏi khác nhau nhưng có liên quan unix.stackexchange.com/questions/46066/ Khăn
derobert

1
Bạn không thể so sánh cp và rm với trình quản lý tệp windows. Bắt đầu cmd.exe và thử sao chép và del và so sánh hành vi.
ott--

Câu trả lời:


11

Derobert của Sao unix mv chương trình không cần -R tùy chọn (recursive) cho các thư mục nhưng cp không cần nó? về cơ bản trả lời câu hỏi của bạn: sao chép hoặc xóa một tệp thông thường khác với thực hiện cùng một thao tác với một thư mục, bởi vì đối với một thư mục bạn phải xử lý tất cả các tệp có trong đó. Do đó hoạt động về cơ bản là khác nhau.

Cũng đáng chú ý là có một tiện ích đặc biệt rmdirchỉ có thể hoạt động trên các thư mục trống. Nếu không kiểm tra các sự kiện, điều này dẫn đến kết luận rằng có thể ban đầu rmchỉ có thể loại bỏ các thư mục không phải xóa và loại bỏ sâu phải đạt được bằng cách sử dụng đệ quy rmvào các thư mục trống và sau đó rmdirloại bỏ các thư mục đó.


rmdircũng là tên của cuộc gọi hệ thống được sử dụng để xóa một thư mục. Thư mục phải trống cho cuộc gọi hệ thống và tiện ích cùng tên chỉ là "front-end", tương tự như unlinklệnh và tiện ích.
jordanm

Chính xác - đó là điều khiến tôi tin rằng ban đầu rmcó thể không thể xóa các thư mục (vì các tiện ích dòng lệnh thường chỉ là các trình bao bọc tương đối đơn giản xung quanh các tòa nhà).
peterph

Tiêu đề câu hỏi của tôi có thể sai lệch khi nghĩ rằng tôi đang hỏi về các chi tiết kỹ thuật. Tôi đã hỏi nếu đó là một sự lựa chọn có chủ ý. Tôi tự hỏi nếu tôi là người duy nhất nghĩ rằng từ quan điểm của người dùng cuối, hành vi này không nhất quán. Tôi chấp nhận câu trả lời của bạn bởi vì nó gián tiếp trả lời câu hỏi của tôi: những hạn chế kỹ thuật trong phần bên trong Unix (ở cấp độ cao) dường như là nguồn gốc của hành vi này và di sản có thể ngăn chúng ta thực hiện bất kỳ cách nào khác ngày hôm nay. Không phải "bao bọc đơn giản xung quanh các tòa nhà cao tầng" được cho là cho chúng ta những hành vi thông minh hơn?
rahmu

2
Từ POV của người dùng cuối, có vẻ như thật lạ, nhưng bạn thực sự đã hỏi về lý do. :) Đối với các hàm bao - tất cả phụ thuộc vào mức độ "đơn giản" của chúng (và những gì bạn vẫn muốn gọi là "đơn giản"). Modern rmchắc chắn không chỉ là một trình bao bọc đơn giản (nó có thể xóa các tệp mroe cùng một lúc và các thư mục). Nếu bạn không muốn cung cấp -rtùy chọn này, hãy sử dụng chức năng răng cưa của vỏ của bạn hoặc tạo trình bao bọc của riêng bạn để đặt nó vào vị trí (sẽ chậm hơn, nhưng độc lập với vỏ bạn đang sử dụng).
peterph

2

Trong một số hương vị UNIX, trang man của rm chỉ định nó như một lệnh để hủy liên kết tệp.
Trong UNIX, các tệp là các đối tượng trong hệ thống tệp được gọi là Inodes, không có tên hoặc vị trí ngoài ID trong hệ thống tệp. Tên của chúng là các tham chiếu đến chúng trong các thư mục khác nhau, là một loại tệp đang lập chỉ mục các tệp (hoặc thư mục, vì chúng là các tệp) được liệt kê trong đó.
Khi hủy liên kết một tệp, số tham chiếu của tệp sẽ giảm và khi về 0, thực tế nó đã bị xóa, vì nó được đánh dấu là miễn phí bởi hệ thống tệp và các khối / phạm vi của nó cũng được đánh dấu miễn phí.

Nếu bạn có khả năng rm một thư mục mà không hủy liên kết các tệp trong đó trước tiên, bạn sẽ đạt đến điểm mà bạn có các nút được tham chiếu trong hệ thống tệp của mình nhưng không thể được truy cập bằng bất kỳ phương tiện thông thường nào.
Vì có một tham chiếu đến chúng theo số tham chiếu của chúng, chúng không được đánh dấu là đã xóa và trở thành các tệp bị mất.
Điều này thậm chí còn phức tạp hơn khi các "tệp" bị mất là các thư mục và do đó làm tăng lượng lưu trữ bị mất trong hệ thống tệp.

Vì vậy, rm -r đã được thêm vào, như một tính năng giúp giảm bớt cuộc sống của người dùng UNIX, do chi phí của "tinh thần UNIX" tiêu chuẩn, vì nó phức tạp hơn các tiện ích UNIX cổ điển khi nó được chuyển xuống các thư mục và xóa các tệp trong,

Ngoài ra, trong thời kỳ đầu của UNIX, các hệ thống không có nhiều bộ nhớ và việc ánh xạ cấu trúc đệ quy của một thư mục đã bị phạt hiệu năng và đôi khi không thể thực hiện được nếu không tách công việc.

cp, đọc một tập tin và sao chép nó, từng khối. Nếu nó sao chép một thư mục giống như một tệp, nó sẽ thêm các tham chiếu đến các tệp bên trong mà không làm tăng số tham chiếu của chúng, điều này có thể dẫn đến dữ liệu không nhất quán (nếu đọc / ghi vào một inode mà các khối được đánh dấu là miễn phí vì chúng inode gốc đã bị xóa), dữ liệu bị mất - vì việc xóa tham chiếu (đã biết) cuối cùng vào một tệp có thể khiến số inode của nó được tái chế.

Đối với đám đông tl; dr: Các thư
mục trong UNIX là một loại tệp, điều đó đúng, nhưng vì thông tin trong chúng được hệ thống xử lý khác nhau, vì nó là siêu dữ liệu của hệ thống tệp, các lệnh thao tác các tệp không thể hoạt động trên các thư mục mà không có thay đổi hành vi của họ để thao túng siêu dữ liệu phụ thuộc là tốt.

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.