Thực hành tốt nhất để bí danh lệnh rm và làm cho nó an toàn hơn


21

Cách đây một thời gian, tôi đã xóa nhầm thư mục nhà vì tôi chạy rm -rf *nhầm thiết bị đầu cuối, thư mục làm việc là thư mục chính!

Tôi ước tôi có một bí danh cho rmlệnh, nhưng nó không phải là trường hợp.

Bây giờ, tôi đang lên kế hoạch để tạo ra một kịch bản như một bí danh rm.

Bạn có bất kỳ thực hành tốt nhất để đề nghị?

Cảm ơn.


7
Không phải tôi không có thiện cảm, nhưng tôi không nghĩ rmlà một lệnh nguy hiểm đòi hỏi bí danh cho sự an toàn. Bằng cách sử dụng rfcác tùy chọn, bạn đang nói với trình bao Tôi biết điều này là nguy hiểm và tôi đã suy nghĩ cẩn thận về nó, và đó là _really_ những gì tôi muốn làm . Nếu bạn không sử dụng các tùy chọn đó, bạn không thể xóa toàn bộ thư mục nhà của mình với nó.
dùng26512

Câu hỏi này có bao gồm thông tin tương tự như stackoverflow.com/questions/373156/ không?
David Harris

1
@grossvogel không có hành vi phạm tội nào :)! Tuy nhiên, bí danh lệnh này là một thực tế phổ biến. Rất nhiều người sử dụng tùy chọn -f để tránh xác nhận từng lần xóa.

23
Lưu ý rằng nếu bạn sử dụng bí danh cho rmbạn, bạn sẽ quen với bí danh đó. Rồi một ngày nào đó, bạn sẽ ở trên một hệ thống mà bí danh không tồn tại và bạn sẽ làm sai khi bạn ít mong đợi nhất. Và nó có thể sẽ không phải là hệ thống của bạn.
Stefan Lasiewski

2
@puller Chỉ trên hệ thống như RHEL rằng bí danh ngớ ngẩn rmđến rm -i.
Daniel Beck

Câu trả lời:


30

Nếu bạn muốn một tùy chỉnh rm, đừng gọi nó rmnhưng tên của bạn myrm, deletehoặc bất cứ điều gì.

Các rm='rm -i'bí danh là một kinh dị vì sau một thời gian sử dụng nó, bạn sẽ mong đợi rmđể nhắc bạn theo mặc định trước khi loại bỏ các file. Tất nhiên, một ngày nào đó bạn sẽ chạy nó với một tài khoản chưa được đặt bí danh và trước khi bạn hiểu chuyện gì đang xảy ra thì đã quá muộn.

Trong mọi trường hợp, một cách tốt để chuẩn bị cho việc mất tập tin hoặc tham nhũng là thực hiện sao lưu.

Một giải pháp thay thế nhanh sẽ bảo vệ bạn khỏi việc xóa hoặc ghi đè tệp vô tình đang sử dụng một hệ thống tệp hỗ trợ ảnh chụp nhanh không giới hạn như ZFS. Nếu các ảnh chụp nhanh thường xuyên được thực hiện tự động, bạn có thể khôi phục các tệp ở trạng thái trong ảnh chụp nhanh cuối cùng trước khi xảy ra sự cố.  


3
Tôi đã nghe câu chuyện kinh dị đó từ một trong những người phải chịu đựng nó.
Dan D.

Tôi đồng ý nhưng hầu hết mọi người không được tự do chuyển sang một hệ thống tập tin hoàn toàn khác.
Peon

Thật vậy, đó là lý do tại sao trước tiên tôi đề nghị thực hiện sao lưu, một tính năng không có hệ thống tệp nào cấm.
jlliagre

12

Nếu bạn muốn lưu bí danh, nhưng không muốn mạo hiểm làm quen với các lệnh hoạt động khác trên hệ thống của bạn so với các lệnh khác, bạn có thể tắt rmnhư thế này

alias rm='echo "rm is disabled, use remove or trash or /bin/rm instead."'

Sau đó, bạn có thể tạo bí danh an toàn của riêng mình, vd

alias remove='/bin/rm -irv'

hoặc sử dụng trashthay thế.


2
Lưu ý rằng (ít nhất là trong một số phiên bản), bạn phải xác định các bí danh theo thứ tự khác. Làm theo thứ tự bạn trình bày định nghĩa removeecho "rm is disabled, use trash or /bin/rm instead." -irv. Và, như một vấn đề thông thường, bạn sẽ không muốn tin nhắn rmđề cập đến removelệnh an toàn của mình chứ?
Scott

Bạn nói đúng, tôi sẽ cập nhật câu trả lời tương ứng.
Dario Seidl

5

Bạn có thể thử sử dụng trashthay thế. Chỉ cần nhớ để trống nó một lần nữa ...


3

Không cần phải thay đổi hồ sơ của mọi người, những gì bạn có thể làm là đặt tệp có tên -i trong thư mục.

# touch -- -i
# ll
total 0
-rw-r--r-- 1 root users  0 Jan 26 19:24 files
drwxr-xr-x 2 root users 40 Jan 26 19:24 folder_of_power
-rw-r--r-- 1 root root   0 Jan 26 19:25 -i
-rw-r--r-- 1 root users  0 Jan 26 19:24 important
-rw-r--r-- 1 root users  0 Jan 26 19:24 very
# rm -rf *
rm: remove regular empty file `files'? 

Sẽ không hoạt động nếu người dùng quyết định sử dụng *. * Thay vì chỉ *. Nhưng vẫn là một mánh khóe gọn gàng.
Peon

1
afaik rm -rf. cũng không phải rm -rf .. không thể thành công vì bạn hiện đang ở trong thư mục.
Peon

@Peon: Tôi tin rằng bạn có nghĩa là .* *, hơn là * .*(mà tôi tin là phổ biến hơn) hoặc * . *(mà bạn nói). Mạnh mẽ và đáng tin cậy và đáng tin cậy. Tất cả đều tuyệt vời, bạn sẽ cần phải làm điều đó trong mọi thư mục mà bạn có quyền viết. . Nhưng tôi đồng ý, đó là một thủ thuật gọn gàng.
Scott

1

Tôi sử dụng kịch bản sau đây.

#!/bin/sh

trash=$HOME/tmp
mv "$@" $trash
nohup find "$trash" -type f -atime +7 -exec /bin/rm '{}' \; 2>&1 &

Nếu bạn vô tình xóa một tập tin, khôi phục nó từ $HOME/tmp.

Tập lệnh di chuyển các tập tin đã xóa vào một tmpthư mục và xóa chúng vào lần tới khi tập lệnh xóa được chạy nếu thời gian truy cập là 7 ngày sau đó (dọn dẹp bán tự động của $HOME/tmpthư mục).


-2

Trong hồ sơ của bạn,

alias rm="rm -i"

3
Theo tôi, riasing là một lời khuyên khá tệ và dù sao nó cũng không giúp được gì trong trường hợp của puller.
jlliagre

rm -Icung cấp tốt nhất của cả hai thế giới, @jlliagre.
Tamara Wijsman

@Tom Wijsman, một phần thực sự. Thay đổi hành vi của một lệnh Unix tiêu chuẩn quan trọng vẫn là một rủi ro tiềm ẩn ở đây. Nếu bạn muốn nó tương tác, hãy đặt tên bí danh khác.
jlliagre

@jlliagre: Hmm, vậy ý ​​bạn là kịch bản có nắm bắt được sự thay đổi này không?
Tamara Wijsman

Vui lòng đọc trả lời của tôi superuser.com/a/382498/19279 để biết quan điểm của tôi.
jlliagre

-2

Một kịch bản được gọi d, với nội dung mv $* /tmp.

chỉnh sửa: Đây là một ý tưởng tồi; xem bên dưới. Tôi hiện đang có alias d='mv -t /tmp'trong của tôi .profilethay thế.


2
Đề xuất này là nguy hiểm và có thể a) ghi đè các tệp đã bị xóa có cùng tên hoặc b) xóa các tệp hoàn toàn sai ( d "foo bar"sẽ xóa các tệp foobar). Một cái gì đó an toàn hơn có lẽ #!/bin/bash TRASH="$( mktemp -d -t trashed.XXX )"; echo "Moving to trash $TRASH"; mv -v -- "$@" "$TRASH"( mktempmvcú pháp phụ thuộc vào hệ thống của bạn, cái này hoạt động cho Linux).
Daniel Beck

2
Cảm ơn đã giải thích. Tôi ổn với vấn đề a) nhưng vấn đề b) là một vấn đề lớn. Tôi đã thay đổi dlệnh của tôi thành alias d='mv -t /tmp'trong tôi .profile; Tôi nghĩ đó là giải pháp đơn giản mà tôi đang tìm kiếm.
thịt bò

-2

Mã bash này thêm chức năng rmvào ~/.bash_profiletập tin cấu hình của bạn . Sau khi chạy nó, nếu bạn viết rm file, bạn sẽ di chuyển tệp đó sang/tmp

cat << EOF >> ~/.bash_profile
rm () {
  mv $1 /tmp
}
EOF

1
Kịch bản / mã này làm gì? Vui lòng giải thích để người dùng ít kỹ thuật có thể hiểu câu trả lời của bạn.
Vylix

2
Trong khi điều này có thể trả lời câu hỏi, nó sẽ là một câu trả lời tốt hơn nếu bạn có thể cung cấp một số lời giải thích tại sao nó làm như vậy.
DavidPostill

1
Điều này không cung cấp câu trả lời cho câu hỏi, nhưng nó rất kém. Hai phiên bản tốt hơn của câu trả lời này đã được đăng.
Scott

Mã bash này thêm chức năng rmvào ~/.bash_profiletập tin cấu hình của bạn . Sau khi chạy tệp này, nếu bạn viết rm file, bạn sẽ di chuyển tệp đó sang /tmp.
Vicente Gonzalez

Cảm ơn vì đã giải thích. Bạn có thể vui lòng chỉnh sửa câu trả lời của bạn để đưa nó vào bài viết không?
Bến N
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.