Trong Unix, làm cách nào để xóa mọi thứ trong thư mục hiện tại và bên dưới nó?


108

Tôi biết điều này sẽ xóa mọi thứ trong một thư mục con và bên dưới nó:

rm -rf <subdir-name>

Nhưng làm cách nào để bạn xóa mọi thứ trong thư mục hiện tại cũng như mọi thư mục con bên dưới nó và nội dung của tất cả các thư mục con đó?


2
Đây phải là một bản dupe: stackoverflow.com/questions/550922/…
jmucchiello

Câu trả lời:


166

Thực hành tính toán an toàn. Chỉ cần tăng một cấp độ trong hệ thống phân cấp và không sử dụng biểu thức ký tự đại diện:

cd ..; rm -rf -- <dir-to-remove>

Hai dấu gạch ngang --cho biết rmđó <dir-to-remove>không phải là một tùy chọn dòng lệnh, ngay cả khi nó bắt đầu bằng dấu gạch ngang.


8
Tại sao điều này lại an toàn hơn?
Yên

34
Bởi vì bạn đang đối sánh cụ thể với một thư mục được đặt tên và do đó ít có khả năng xóa thứ gì đó mà bạn không định xóa.
tvanfosson

5
Thật. Tôi có thể thấy mình làm điều đó khá dễ dàng.
Yên

26
nó không xóa chính thư mục đó? Bạn phải thực hiện mkdir <dir-to-remove> sau đó. Nhưng sau đó bất kỳ liên kết cứng nào đề cập đến thư mục đó sẽ là một thư mục riêng biệt sau đó.
Johannes Schaub - lít

5
@Yen, nếu bạn sử dụng, rm ./bạn có thể vô tình gõ rm . /và có thể là thảm họa.
irfandar 12/10/12

44

Sẽ xóa tất cả các tệp / thư mục bên dưới tệp hiện tại.

find -mindepth 1 -delete

Nếu bạn muốn làm điều tương tự với một thư mục khác có tên của bạn, bạn có thể đặt tên đó

find <name-of-directory> -mindepth 1 -delete

Nếu bạn muốn xóa không chỉ các thư mục con và tệp của nó, mà còn cả chính thư mục, hãy bỏ qua -mindepth 1. Làm điều đó mà không -deletecó danh sách những thứ sẽ bị loại bỏ.


Tôi cần xóa tất cả các tệp trong thư mục con, nhưng không muốn xóa chính các thư mục con. find <name-of-direcotry> -mindepth 2 -delete hoạt động tốt!
Tim Dearborn

Bạn cần -mindepth 1nếu bạn đang chỉ định một thư mục ( find <name-of-directory> -mindepth 1 -delete). Nếu không thì Johannes nói đúng nó sẽ không xóa thư mục làm việc hiện tại (khi sử dụng find -delete).
Weboide

IMO, đây là câu trả lời hay nhất, đặc biệt là trong script.
wizonesolutions,

1
Tôi đã thử: find -mindepth 1 -deletenhưng tôi nhận được illegal option -- mnhưng nó hoạt động tuyệt vời khi tôi loại bỏ tùy chọn mindepth find . -delete
sharon

41

Điều tôi luôn làm là gõ

rm -rf *

sau đó nhấn ESC- * và bash sẽ mở rộng * thành một danh sách rõ ràng các tệp và thư mục trong thư mục làm việc hiện tại.

Những lợi ích là:

  • Tôi có thể xem lại danh sách các tệp cần xóa trước khi nhấn ENTER.
  • Lịch sử lệnh sẽ không chứa "rm -rf *" với ký tự đại diện còn nguyên vẹn, sau đó ký tự này có thể vô tình được sử dụng lại không đúng chỗ vào sai thời điểm. Thay vào đó, lịch sử lệnh sẽ có tên tệp thực trong đó.
  • Nó cũng trở nên hữu ích một hoặc hai lần để trả lời "đợi một chút ... tôi vừa xóa tệp nào?". Tên tệp được hiển thị trong bộ đệm cuộn ngược đầu cuối hoặc lịch sử lệnh.

Trên thực tế, tôi thích điều này đến nỗi tôi đã đặt nó làm hành vi mặc định cho TAB với dòng này trong .bashrc:

bind TAB:insert-completions

Thiếu --trong câu trả lời này? Tôi phải nói cách tiếp cận này là tuyệt vời.
Ben Voigt

cách tốt hơn là chạy điều này với sudo
Abbas Torabi

22

Sử dụng

rm -rf *

Cập nhật: Viết .tắt của thư mục hiện tại, nhưng chúng tôi không thể sử dụng nó. Lệnh này dường như có các kiểm tra rõ ràng đối với ... . Thay vào đó, hãy sử dụng ký tự đại diện cầu vồng. Nhưng điều này có thể rủi ro.

IMO phiên bản an toàn hơn được sử dụng:

rm -ri * 

(điều này sẽ nhắc bạn xác nhận trước khi xóa mọi tệp / thư mục.)


13
"Có thể mạo hiểm" là tuyệt vời.

5
Khi làm những việc như thế này, tôi đã tìm thấy một ls -r nhanh chóng. trước tiên cho phép bạn xem những gì bạn sẽ xóa. Hữu ích khi đưa ra một ý tưởng nhanh rằng bạn sẽ không xóa toàn bộ đĩa ...
Rich Bradshaw

2
Tại sao nó lại rủi ro hơn rm -rf <subdir-name>?
Yên

2
@Yen - bởi vì nếu bạn làm điều đó không đúng chỗ, bạn có thể nhận được kết quả thảm hại. Sử dụng một tên cụ thể không đúng chỗ chỉ có thể sai nếu cùng một thư mục con tồn tại ở đó.
tvanfosson

1
Bạn không thể xóa cha mẹ khi còn sống trong đứa trẻ.
dirkgently

6

Đúng là rm –rf .sẽ xóa mọi thứ trong hiện tại trực tiếp bao gồm mọi thư mục con và nội dung của chúng. Các dấu chấm đơn ( .) có nghĩa là thư mục hiện hành. cẩn thận không nên làm rm -rf ..dấu chấm kép ( ..) có nghĩa là thư mục trước đó.

Điều này đang được nói, nếu bạn giống tôi và có nhiều cửa sổ đầu cuối mở cùng một lúc, tốt hơn bạn nên an toàn và sử dụng rm -ir .Hãy xem các đối số lệnh để hiểu tại sao.

Đầu tiên, nếu bạn nhìn vào trang rmcommand man ( man rmtrong hầu hết Unix), bạn sẽ thấy điều đó –rcó nghĩa là "loại bỏ nội dung của các thư mục một cách đệ quy". Vì vậy, làm rm -r .một mình sẽ xóa tất cả mọi thứ trong thư mục hiện tại và mọi thứ bên dưới nó.

Trong rm –rf .-f được thêm vào có nghĩa là "bỏ qua các tệp không tồn tại, không bao giờ nhắc". Lệnh đó sẽ xóa tất cả các tệp và thư mục trong thư mục hiện tại và không bao giờ nhắc bạn xác nhận rằng bạn thực sự muốn làm điều đó. -fđặc biệt nguy hiểm nếu bạn chạy lệnh dưới quyền người dùng đặc quyền vì bạn có thể xóa nội dung của bất kỳ thư mục nào mà không có cơ hội đảm bảo đó thực sự là thứ bạn muốn.

Trên otherhand, trong rm -ri .những -iđiều đó thay thế -fcó nghĩa là "lời nhắc trước khi loại bỏ bất kỳ". Điều này có nghĩa là bạn sẽ có cơ hội nói "oups! Đó không phải là điều tôi muốn" trước khi rm vui vẻ xóa tất cả các tệp của bạn.

Trong những ngày đầu sử dụng sysadmin, tôi đã thực hiện rm -rf /trên một hệ thống trong khi đăng nhập với đầy đủ các đặc quyền (root). Kết quả là sau hai ngày khôi phục hệ thống từ các bản sao lưu. Đó là lý do tại sao bây giờ tôi rm -riđang làm việc.


6

Làm thế nào về:

rm -rf "$(pwd -P)"/* 

27
jQuery rất mạnh mẽ.
Pawel

5
rm  -rf * 

Đừng làm điều đó! Nguy hiểm! ĐẢM BẢO BẠN ĐANG Ở ĐÚNG HƯỚNG DẪN!


4

đảm bảo bạn đang ở đúng thư mục

rm -rf *

2
Thao tác này không xóa các tệp hoặc thư mục con có tên bắt đầu bằng dấu chấm.

1
thật. trong thử nghiệm của tôi, rm -rf cũng vậy. tvanfosson có giải pháp tốt nhất IMO với mình "cd ..; rm -rf <dir-to-remove>"
digitaljoel

2

Giải pháp chung và an toàn đơn giản nhất này có lẽ là:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf

1

Tôi tin rằng câu trả lời này tốt hơn:

/unix/12593/how-to-remove-all-the-files-in-a-directory

Nếu thư mục cấp cao nhất của bạn được gọi images, thì hãy chạy rm -r images/*. Điều này sử dụng toán tử shell global *để chạy rm -rtrên mọi tệp hoặc thư mục trong hình ảnh.

về cơ bản, bạn lên một cấp, sau đó nói xóa mọi thứ bên trong thư mục X. Bằng cách này, bạn vẫn đang chỉ định thư mục nào sẽ bị xóa nội dung của nó, điều này an toàn hơn là chỉ nói 'xóa mọi thứ ở đây', trong khi vẫn giữ nguyên thư mục gốc, (đôi khi bạn muốn vì không được phép hoặc không muốn để sửa đổi các quyền hiện có của thư mục)

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.