Chúng ta có hoàn tác trong Linux không?


Câu trả lời:


53

Linux (giống như các đơn vị khác) thực sự không cung cấp tính năng hoàn tác. Triết lý là nếu nó biến mất, nó sẽ biến mất. Nếu nó là quan trọng, nó đã được sao lưu.

Có một hệ thống tập tin cầu chì tự động giữ các bản sao của các phiên bản cũ: copyfs , có sẵn trong tất cả các bản phân phối tốt. Tất nhiên, điều đó có thể sử dụng rất nhiều tài nguyên.

Cách tốt nhất để bảo vệ chống lại các tai nạn như vậy là sử dụng hệ thống kiểm soát phiên bản (cvs, bazaar, darcs, git, mercurial, lật đổ, ...). Phải mất một ít thời gian để tìm hiểu, nhưng nó mang lại kết quả khủng khiếp trong trung và dài hạn.


1
lựa chọn tốt có thể là gitfs, đang bị
phá hủy

1
Chà, nếu bạn vô tình xóa hoặc ghi đè lên một tệp mà bạn chưa thực hiện hoặc cam kết thì ngay cả CVS cũng không giúp được gì
xdevs23

14

Tiếc là không có.


19
Tôi không biết rằng tôi coi điều này là không may ... Sẽ mất khá nhiều tài nguyên để thực hiện hoàn tác. Tôi thậm chí không thích -itùy chọn rmbật theo mặc định. Các hệ thống Unix của tôi không nên nắm tay tôi.
xenoterracide

5
-i được bật theo mặc định?! không phải distro của tôi, không thưa ngài!
Stefan

9

Không, không có phép thuật hoàn tác trong bất kỳ Unix. Unix giả định rằng bạn biết những gì bạn đang làm. Để hỗ trợ Hoàn tác, hãy sử dụng một VCS (trình soạn thảo văn bản của bạn có thể cũng được tích hợp sẵn).

Hầu hết các hệ thống tập tin không có khả năng thực hiện nó trong suốt.

Khôi phục hệ thống và máy thời gian trên mac và windows tương ứng chỉ là hệ thống kiểm soát sao lưu / thay đổi.


7

Không có hoàn tác trong dòng lệnh. Tuy nhiên, bạn có thể chạy các lệnh như rm -imv -i. Điều này sẽ nhắc bạn với một "bạn có chắc không?" câu hỏi trước khi họ thực hiện lệnh.

Cũng có thể thêm bí danh cho nó vào tập lệnh khởi động (ví dụ: ~/.bashrchoặc /etc/bash.bashrc):

alias remove='rm -i'
alias move='mv -i'

Chỉnh sửa: bằng các gợi ý bên dưới, tôi đã xóa lời khuyên của mình để đặt bí danh cho các lệnh mặc định. Thay vào đó, nó giới thiệu các lệnh mới bây giờ).


1
+1. chỉ để thêm vào đây Sau khi đặt các bí danh ở trên nếu trong một số trường hợp bạn muốn xóa trực tiếp mà không có dấu nhắc "bạn có chắc không", bạn có thể sử dụng \ rm và \ mv để bỏ qua bí danh. bạn cũng có thể sử dụng tùy chọn -f.
Hemant

2
mv -ichỉ nhắc khi nó ghi đè lên một tệp (làm cho nó hữu ích và không đáng ghét). Trong cùng một tĩnh mạch , alias cp='cp -i'.
Gilles 'SO- ngừng trở nên xấu xa'

8
Aliasing rm và mv là một ý tưởng rất xấu. (rm là tồi tệ hơn tất cả.) Không bao giờ có thói quen sử dụng rm để có nghĩa là rm -i - cuối cùng bạn sẽ sử dụng nó ở một nơi mà bí danh không được xác định và bạn sẽ xóa một cái gì đó cho tốt. Nếu bạn thích được nhắc nhở, hãy tập thói quen sử dụng rm -i mọi lúc.
msakr

Nếu bạn muốn được nhắc, hãy sử dụng bí danh dưới một tên khác. Tôi sử dụng move = 'mv -i', copy = 'cp -i', symlink = 'ln -si' và cài đặt lệnh rác để sử dụng thay vì rm. Tôi vẫn sử dụng trực tiếp mv, cp và rm khi viết kịch bản, nhưng để sử dụng tương tác, các bí danh này rất tiện dụng.

@mahmoudsakr Bạn hoàn toàn đúng, tôi đã bỏ lỡ điểm đó. Tôi cũng không có các lệnh này. Bí danh chúng như một lệnh khác có vẻ như là tùy chọn lành mạnh nhất!
vdboor

4

Lý do các hệ thống Linux / Unix không có nguồn gốc chưa hoàn chỉnh xuất phát từ cách hầu hết các hệ thống tập tin lưu trữ thông tin của chúng. Tất cả thông tin meta tập tin được lưu trữ ở phía trước đĩa với các tham chiếu đến các nút trên phần còn lại của đĩa. Thông thường, hầu hết các hệ thống tệp phân bổ 10 khối cho một tệp trong vùng meta này. 7 đầu tiên đề cập đến 7 nút đầu tiên. Thứ 8 và thứ 9 đi đến danh sách các nút (các khối được liên kết đôi) và thứ 10 đi đến một danh sách các danh sách (các khối được liên kết ba lần). Điều này thay đổi từ hệ thống tệp sang hệ thống tệp (ext4, jfs, xfs, v.v.) nhưng các danh sách khối này thường có thể giải quyết kích thước tệp ở bất cứ đâu từ 2GB đến vài TB.

Nhưng vì tất cả thông tin này được lưu trữ ở phía trước đĩa, khi một tệp bị xóa, không có cách nào để tham chiếu các nút trên đĩa với dữ liệu meta mà chúng sử dụng để thuộc về. Ngược lại, FAT32 và NTFS thực sự lưu trữ một số thông tin tiêu đề với chính các tệp giúp dễ dàng xác định tập tin khối nào được sử dụng (miễn là không gian đó chưa được thu hồi bởi các tệp mới hơn). Trong công việc Linux, khi bạn xóa một cái gì đó, gần như luôn luôn là thứ đầu tiên được ghi đè ngay lập tức bởi dữ liệu mới cho hiệu quả.


2

Nếu bạn thực sự muốn một tính năng hoàn tác, hãy sử dụng kiểm soát nguồn. Subversion thực sự hoạt động rất tốt trên một máy người dùng. Tôi sử dụng nó để kiểm soát tất cả các tệp cá nhân của tôi trên hệ thống nhà của tôi. Nó có vẻ như quá mức cần thiết, cho đến khi thảm họa, một kịch bản lừa đảo hoặc một lỗi đánh máy dòng lệnh.


1
Nó sẽ không bảo vệ bạn khỏi rm -r .mặc dù. ;)
Umang

1
@Umang Tôi thực sự đã làm điều đó một lần với git, nơi tôi giữ một kho lưu trữ cục bộ và vô tình rm -r project.git. May mắn thay nếu bạn giữ một phiên bản khác trên một máy chủ từ xa không có khả năng xảy ra
phunehehe

1
@phunehehe và bất cứ ai + 1'd nhận xét của tôi: chúng tôi đã quá quen với DVCS để nhận ra rằng tôi đã hoàn toàn sai. SVN cam kết repo (không phải là chi nhánh). Vì vậy, bạn sẽ thực sự được bảo vệ rm -r .. Thực sự ngu ngốc của tôi.
Umang

2

Một điều mà tôi muốn thêm vào .bashrc của mình là chức năng sao chép và xóa. Cái gì đó như:

cprm(){
    cp -p $1 ~/deleted/$1
    rm $1
}

Nhưng bạn phải tập thói quen gõ cprm chứ không phải rm.

Rõ ràng bạn sẽ cần phải giữ trên đầu của khu vực bị xóa nếu bạn có không gian đĩa hạn chế.


4
bạn thực sự có thể rút ngắn điều đó xuống mv $ 1 ~ / đã xóa / $ 1
Stefan

có, và nó sẽ ghi đè lên một tệp 'Tài liệu mới 1' bằng một tài liệu khác 'Tài liệu mới 1', nếu bạn có quyền trích dẫn : "$1".
người dùng không xác định

@userunknown: bạn có nghĩa là $ 1 trong mã của Deano và Stefan nên được trích dẫn là "$ 1"?
Tim

@Tim: Vâng, tôi làm.
người dùng không xác định

Tại sao không làm di chuyển thay vì cp và rm?
dùng1559897

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.