Làm cách nào để xóa tất cả các tệp và thư mục con trong thư mục MÀ KHÔNG xóa thư mục trong bash?


53

Có một lệnh để loại bỏ tất cả các tập tin và thư mục con trong một thư mục mà KHÔNG xóa thư mục?

Ví dụ: nếu tôi có thư mục "dontDeleteMe" với các thư mục con "1", "2", "3" và mỗi thư mục con có một vài hình ảnh trong đó, làm cách nào tôi có thể xóa các thư mục con "1", "2" và "3" và tất cả các tệp trong chúng, mà không xóa thư mục mẹ "dontDeleteMe"?

Câu trả lời:


66

Để xóa mọi thứ trong một thư mục mà không xóa thư mục, hãy nhập:

rm -rfv dontDeleteMe/*

Xin lưu ý, /*phần rất quan trọng. Nếu bạn đặt một khoảng trắng trước *, nó sẽ xóa tất cả các tệp của bạn trong thư mục hiện tại của bạn.

Ngoài ra, hãy rất cẩn thận khi chơi với rm, -r*tất cả trong cùng một lệnh. Họ có thể là một sự kết hợp tai hại.

Cập nhật: Được rồi, tôi nhận ra nếu bạn có tệp ẩn / dấu chấm [tên tệp có dấu chấm ở đầu, ví dụ .hidden] thì điều này sẽ giữ nguyên các tệp đó.

Vì vậy, thực sự, giải pháp đơn giản nhất cho câu hỏi ban đầu là: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Một số khác sẽ được sử dụng find's -execlựa chọn hoặc ống để xargs(dưới đây):

find dontDeleteMe/* -print0 | xargs -0 rm -rv


Bạn có thể cho một ví dụ về việc sử dụng xargs? Xargs là gì?
justingrif

@justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv Tôi tin rằng trong hầu hết các trường hợp, điều này sẽ hoạt động, bất kể không gian, và những gì không. Nhưng cd đến /tmp/và tạo một thư mục thử nghiệm và thử nó. :)
Matt

Ồ, và từ trang man: "xargs - xây dựng và thực thi các dòng lệnh từ đầu vào tiêu chuẩn"
Matt

5
Làm lại một thư mục không bằng xóa nội dung của nó. ví dụ: sự khác biệt về quyền của thư mục umask, sự khác biệt của chủ sở hữu, v.v ... câu trả lời của enzotib sẽ giải quyết các vấn đề với cú pháp ban đầu của bạn

3
Đây không phải là một câu trả lời tốt. Sử dụng * là nguy hiểm và sẽ không hoạt động trên dotfiles mà không có "dotglob" (xem bên dưới). rm -rf dontDeleteMe && mkdir dontDeleteMekhông đảm bảo rằng thư mục được tạo lại với cùng quyền / chủ sở hữu. Thay vào đó, sử dụng một trong các find dontDeleteMe/ -mindepth 1 -deletebiến thể dưới đây.
Nils Toedtmann

27

Lý do duy nhất rm -r ./*không phải lúc nào cũng hoạt động là vì bạn có thể có các tệp và / hoặc thư mục ẩn không khớp với *.

Để kết thúc này, bashcung cấp một tùy chọn để làm cho *khớp mọi thứ, ngay cả các đối tượng ẩn:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

Có thể hữu ích để đặt lại dotglobvề trạng thái mặc định (không đặt) của nó, nếu bạn tiếp tục sử dụng trình bao nơi bạn đã thực hiện các lệnh trên:

shopt -u dotglob 

Nó cũng không thể hoạt động khi bạn có một số lượng lớn tệp
S ..

23

Mở thiết bị đầu cuối ( Ctrl+ Alt+ T) loại này:

find somedir -mindepth 1 -delete

Điều này sẽ phù hợp với tất cả các tệp và thư mục bên trong somedirvà (các) con của nó bao gồm các tệp chấm "ẩn" nhưng loại trừ somedirchính nó vì -mindepth 1sau đó là -deletechúng.


Chào mừng bạn đến với AskUbfox! Mặc dù câu trả lời của bạn có khả năng giúp người đăng ban đầu, việc thiếu thông tin để giải thích điều này sẽ làm gì để giúp anh ấy / cô ấy làm cho câu trả lời của bạn không đầy đủ.
Oyibo

3
Thiếu giải thích, nhưng vẫn là câu trả lời tốt nhất. Cũng hoạt động trong OSX (tất nhiên ngoại trừ cách mở Terminal, tất nhiên).
noamtm

6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Sử dụng xdevtùy chọn để xóa các tập tin chỉ trong phạm vi thiết bị.


GNU tìm thấy có -delete. Nó ngụ ý -depthvà dễ nhớ hơn-depth -exec rm -Rf {} \;
Nils Toedtmann

4

Để xóa (trong thiết bị đầu cuối) tất cả các tệp và thư mục con ngoại trừ thư mục cơ sở có tên "dontdelete":

rm -rf dontdelete/*

Điều này không xóa các tập tin ẩn, vì vậy "tất cả các tập tin" có thể quá đậm một tuyên bố.
Stefan van den Akker

4

Bạn có thể sử dụng findvới -deletecờ:

find dontDeleteMe/* -delete

Điều /*này rất quan trọng vì nó chỉ yêu findcầu tìm kiếm bên trong thư mục có tên "dontDeleteMe".

Cũng đảm bảo rằng -deletecờ nằm ​​ở cuối findlệnh.


1
Giải pháp này không xóa bất kỳ tập tin ẩn nào, trừ khi bạn kích hoạt dotglob. Mặt khác, sử dụng -mindepth 1tùy chọn cờ dường như là cách duy nhất để làm cho nó hoạt động.
Stefan van den Akker

3
rm -rf  directory/{.*,/*}

Những gì nói:

Xóa tất cả các tập tin bắt đầu với. trong "thư mục" và tất cả các tập tin khác.

Mặc dù như Neftas lưu ý , giải pháp này không an toàn!

Giải pháp an toàn hơn là:

 rm -rf directory/!(.|..)

Lệnh này có thể nguy hiểm, vì bạn cũng bao gồm .và các ..thư mục. Điều này có thể tránh được bằng cách thay đổi {.*}thành {.??*}, nhưng sau đó bạn sẽ không xóa các tệp ẩn chỉ có một ký tự, chẳng hạn như .a.
Stefan van den Akker

cái này thì sao thư mục rm -rf /! (. | ..)
Tebe

Đó có vẻ là một giải pháp tốt hơn nhiều so với những gì tôi nghĩ ra. Tôi có thể đề nghị bạn chỉnh sửa câu trả lời của bạn?
Stefan van den Akker

đề nghị được chấp nhận)
Tebe

1

Tôi không chắc tại sao điều này quá phức tạp, hãy giúp tôi nếu tôi sai

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

Đó là nó


Điều này cũng có một chút sai sót khi cố gắng xóa thư mục hiện tại, tất nhiên, điều này không hoạt động, bởi vì nó vẫn được sử dụng làm thư mục làm việc của trình vỏ gọi.
David Foerster

1

Có một câu trả lời thậm chí còn đơn giản hơn:

  1. cd dontDeleteMe

  2. rm -rf *

Thời gian giảng bài quản trị hệ thống cơ bản: Hãy chắc chắn chú ý đến vị trí của bạn khi bạn sử dụng các lệnh quét như thế này.

Tôi không thể nói thế là đủ. Tôi đã phải khôi phục một hộp vì ai đó đã không chú ý và nhập vào rm -rf *trong /.

* nix giả định rằng nếu bạn là root hoặc nếu bạn sudo-ing là root mà bạn biết bạn đang làm gì. Vì vậy, hãy chắc chắn rằng bạn biết những gì bạn đang làm trước khi bạn làm điều đó.

Một cách khác để đảm bảo lệnh 'cd' của bạn hoạt động trước khi bạn phát hành 'rm' là sử dụng

cd dontDeleteMe && rm -rf *

6
Đây là một gợi ý nguy hiểm. Những gì bạn muốn là: cd dontDeleteMe && rm -rf *
Izkata

@Izkata Hoặc đảm bảo kiểm tra xem thao tác cd đã thành công hay chưa, trước khi ban hành lệnh rm.
Eliah Kagan

1
@EliahKagan Đó chính xác là những gì đoạn mã của tôi làm ...
Izkata

Trên thực tế, nó không còn nhiều hoặc ít nguy hiểm hơn những gì bạn đề xuất. Tất cả các && làm là xâu chuỗi hai lệnh lại với nhau để chúng thực thi cùng một lúc. Nếu bất cứ điều gì phương pháp của tôi thực sự TIẾT KIỆM vì bạn phải dừng lại và xem trước khi bạn thực hiện rm -rf *. Tạm dừng để kiểm tra lại luôn luôn tốt hơn.
30619

5
@ user30619 &&Toán tử không chỉ xâu chuỗi các lệnh lại với nhau; nó yêu cầu mỗi lệnh phải thành công trước khi lệnh tiếp theo được thực thi. Nếu cdlệnh không thành công vì bất kỳ lý do nào (thư mục không tồn tại, đặc quyền, v.v.) thì rmlệnh sẽ không được thực thi. Tôi gọi đó là an toàn hơn.
ean5533

0
  1. Điều dễ nhất đối với tôi - một chuyên gia về windows nhưng là một người mới sử dụng Ubuntu
  2. Nhấp vào biểu tượng Tệp trên trình khởi chạy
  3. Điều hướng đến thư mục chứa các tệp và thư mục mà bạn muốn xóa
  4. Nhấp chuột phải vào một vùng trống của cửa sổ bên cạnh các tệp và nhấp vào "Mở trong Terminal" - để cửa sổ Tệp mở
  5. Một cửa sổ đầu cuối sẽ mở và sẽ được "đặt" vào thư mục bạn đặt
  6. Bạn có thể nhập "dir" (bỏ qua dấu ngoặc kép khi tôi nói loại) và nhấn enter cho thiết bị đầu cuối để hiển thị danh sách các tệp và thư mục - chỉ để chứng minh bạn đang "ở" thư mục bên phải
  7. gõ "rm -rf *" và nhấn enter
  8. tùy thuộc vào kích thước thư mục / tập tin cần xóa hệ thống sẽ tạm dừng
  9. Khi dấu nhắc thiết bị đầu cuối trở lại, cửa sổ Tệp bạn đã mở bây giờ sẽ thông báo "Thư mục trống"
  10. Tôi đã thành công với phương pháp này và nó giúp tôi thoải mái khi thấy các tệp / thư mục cả trong cửa sổ Tệp và kết quả của lệnh Dir trong cửa sổ đầu cuối
  11. Tôi cũng được an ủi rằng cửa sổ Tệp hiện hiển thị thư mục trống - đặc biệt là vì tôi đã theo đuổi các tệp này xung quanh để tìm thư mục rác mà chúng nằm trong
  12. Cảm ơn tất cả những người khác đã gửi câu trả lời - nó rất nhiều thông tin

Điều đó có vẻ khá phức tạp - đặc biệt là vì cuối cùng bạn sẽ chạy rm -rf *.
David Foerster

0
rm -rf ${PWD}/*

sẽ xóa thư mục làm việc hiện tại

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.