'Rm -r ~' đã làm gì vào thư mục nhà của tôi?


17

gedit tạo các tệp sao lưu ẩn kết thúc bằng '~'. Tôi muốn làm sạch đệ quy cây thư mục của tôi.

Lệnh rm *~sẽ xóa tất cả các tệp cục bộ kết thúc bằng '~'

Tôi nghĩ rằng rm -r *~ .sẽ xóa tất cả các tập tin trong toàn bộ cây, nhưng tôi đánh máy rm -r ~.

Có một tin nhắn một số thư mục không thể xóa và tôi thoát lệnh. Câu hỏi là: Tôi đã xóa cái gì?

Tôi đã nhận thấy rằng cấu hình Filezilla của tôi đã biến mất. Lệnh này có xóa tất cả các thư mục ẩn khỏi thư mục nhà không?


4
Chà, ít nhất tôi có một chiến lược dự phòng ... Không có tác hại thực sự nào.
GUI Junkie

2
Tốt để biết; Tôi có một chính sách không bao giờ sử dụng -rtrừ khi tôi muốn thoát khỏi mọi thứ.
ish

3
Là một lưu ý phụ, rm -r *~ .sẽ xóa tất cả các tệp và thư mục (trong thư mục hiện tại) phù hợp *~hoặc .. ( .sẽ bị bỏ qua bởi rmmột ngoại lệ đặc biệt, vì hầu hết mọi người không muốn xóa đệ quy thư mục hiện tại. *~Xóa tất cả các tệp và thư mục trong thư mục hiện tại kết thúc ~, nhưng không phải các tệp và thư mục trong thư mục con của thư mục hiện tại. ) Vì vậy, đó không phải là những gì bạn sẽ muốn. Bạn có thể đã muốn sử dụng findvới -execcờ để xem đệ quy qua cây thư mục và xóa không đệ quy từng tệp kết thúc bằng ~.
Eliah Kagan

@EliahKagan, tôi đoán vậy, nhưng tìm với -exec luôn là một rắc rối. Khôi phục thư mục tại nhà gặp nhiều rắc rối hơn, mặc dù :-)
GUI Junkie

1
Thông tin: hát ~nhân vật mà không thoát khỏi nó (như thế này \~:) sẽ khiến Bash, ZSH, v.v. ( rmvề cơ bản là lệnh) nghĩ rằng bạn có nghĩa là thư mục chính.
Thomas Ward

Câu trả lời:


31

Bạn đã xóa (gần như) tất cả các thư mục nhà của bạn!

rm -r something đệ quy xóa các tập tin và thư mục trong / dưới một cái gì đó ; nó sẽ chỉ thất bại đối với các mục mà nó không có quyền xóa, vì chúng thuộc sở hữu của một người dùng khác (ví dụ root) hoặc do chúng đang được sử dụng (ví dụ: ngàm GVFS).

Nếu bạn không thêm -f(như trong, rm -rf something), bạn sẽ nhận được một cái gì đó như:

rm: remove write-protected regular file something’?
rm: descend into write-protected directory something’?

Tại thời điểm này, bạn có thể hủy bỏ và sau đó bạn có thể nhận ra rằng bạn đã thực hiện lệnh sai.

Gợi ý từ cộng đồng về cách tránh những tai nạn như vậy

Lưu ý: Cộng đồng wiki, mọi người vui lòng đóng góp.

  • Đối với một vài tệp, sử dụng -itùy chọn để nhận xác nhận về việc xóa tệp hoặc thư mục:

    $ rm -ri something/
    rm: remove regular file something/file~’? y
    rm: descend into directory something’? y
    rm: remove regular file something/file’? y
    rm: remove directory something’? y
  • Nếu xóa khỏi thư mục hiện tại, hãy thêm tiền tố vào đó ./để tránh xóa nhầm vị trí khác.

    $ cd something
    $ rm -v ./*~
    removed ‘./file~’

    Trên đây là để chứng minh việc sử dụng ./. Nếu có thư mục con, tất nhiên bạn cũng có thể sử dụng rm -v something/*~. Cẩn thận : đừng nghĩ rằng rm ./.*loại bỏ tất cả các tập tin ẩn trong thư mục hiện tại. Xem câu hỏi Serverfault này để biết cách giải quyết trên các tập tin ẩn.

  • Di chuyển thay vì xóa: Thay vì xóa các tệp đệ quy ở nơi đầu tiên tôi đã sử dụng để di chuyển các tệp tôi muốn thoát khỏi một nơi khác trước khi tôi xóa chúng cuối cùng. Nếu có lỗi xảy ra, nó dễ dàng khôi phục.

    mv -b SOURCE DEST
  • Sử dụng find(có thể với grep) để xem trước nếu bạn muốn xóa đệ quy các tệp đã chọn. Bạn nên cố gắng biến điều này thành một sự cố hiếm gặp, nhưng nếu bạn phải ...

    1. findkhông có đối số liệt kê đệ quy tất cả các tệp / thư mục theo cái hiện tại. Bạn nên cố gắng tìm kiếm man findcách làm cho nó chọn lọc (một kho báu), nhưng nếu bạn không muốn làm phiền, bạn chỉ có thể sử dụng quen thuộc grepđể lọc các tệp bạn muốn xóa.
    2. Giả sử tôi là một hacker hạt nhân uber-l33t và bị làm phiền bởi một vài KB tệp "ví dụ" trong cây nguồn của tôi; Tôi muốn xóa tất cả các tập tin có chứa trong tên. Vì vậy, tôi gõ find | grep example, cung cấp cho tôi 20 tập tin. Điều đó có vẻ tốt, vì vậy bây giờ tôi đi và xóa các tệp chính xác đó, cùng với rm -vđầu ra dài dòng được đề cập trước đây, thông qua xargs:
      tìm | ví dụ grep | xargs rm -v
      cung cấp cho tôi đầu ra này. Việc xem trước như vậy ngăn ngừa các vấn đề trong đó nói, bạn tạo một lỗi đánh máy và gõ samplethay vì example.

Các giải pháp trên không nên được sử dụng nếu bạn có thể có tên tập tin chứa khoảng trắng, ký tự tab, dòng mới, hoặc dấu ngoặc kép ( "hoặc '), vì điều này sẽ dẫn xargsđến một trong hai thất bại, hoặc thức ăn chăn nuôi rmvới tên tập tin không đầy đủ, mà trong trường hợp xấu nhất có thể sẽ loại bỏ các sai các tập tin. Cách an toàn để làm những điều trên là làm tất cả với findcác toán tử và hành động.

Sau đây sẽ hiển thị tất cả các tệp có chứa từ example

find . -name "*example*"  

Nếu danh sách đó là các tệp bạn muốn xóa, hãy sử dụng -exechành động để chuyển các tệp tới rm.

find . -name "*example*" -exec rm -v {} +

Xem Sử dụng Tìm để được trợ giúp thêm với việc sử dụng find.


1
findđầu ra đường ống đến grepxargs rmnguy hiểm.
geirha

2
@izx: đã thêm mv(lệnh yêu thích của tôi);)
Takkat

1
Ít nhất tôi sẽ thêm một ví dụ về cách sử dụng cách findan toàn, một cách không phá vỡ (và có khả năng xóa các tệp sai) nếu tên tệp chứa khoảng trắng, tab, dòng mới "hoặc 'ký tự. Ví dụ find . -name "*example*" -exec rm -v {} +. mywiki.wooledge.org/UsingFind
geirha

1
@geirha: tại sao find -deletelại nguy hiểm như vậy? Tôi đã có thể nói điều gì đó ở đây nhưng tôi không biết gì ngoài việc nó được tìm thấy gần đây và xóa sạch /mặc dù tôi không có tùy chọn nào -deletechỉ tìm thấy vài tệp mà tôi muốn xóa. Tôi thấy rằng bạn đề nghị -exec rmthay thế.
Takkat

3
@Takkat -deletekhông nguy hiểm, và bạn có thể sử dụng nó một cách an toàn thay vì -exec rm {} +. Tôi thường thích sử dụng các công cụ và tính năng tiêu chuẩn khi có thể. -deletelà một phần mở rộng GNU không chuẩn, findvì vậy nó sẽ hoạt động tốt trên Ubuntu, nhưng có thể không hoạt động trên các hệ thống khác.
geirha

5

Đúng. Một ký tự dấu ngã không được trích dẫn như một đối số riêng biệt được mở rộng cho homedir của bạn. Vì vậy, rm -r ~đã được mở rộng để rm -r /home/yourusename. Vì vậy, bạn đã nói với rm để xóa đệ quy tất cả các tệp trong homedir của bạn.

Xem http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion để biết thêm về cách hoạt động của mở rộng dấu ngã.

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.