Xóa tất cả các thư mục con trừ một


10

Giả sử trong thư mục hiện tại, có nhiều thư mục con và một thư mục được gọi là A.

Làm thế nào để xóa tất cả các thư mục con ngoại trừ A với Bash?

Câu trả lời:


23

Bash đã mở rộng toàn cầu (thử nghiệm đầu tiên, sau đó loại bỏ tiếng vang):

shopt -s extglob
echo rm -rf !(A)

(trước khi tôi quên - bạn có thể vô hiệu hóa hoàn thành lịch sử kiểu CSH, trong Bash3 có một lỗi trong khi bỏ qua! (. set + H

+1 Bash nếu đầy bất ngờ! Đôi khi họ tốt đẹp như thế này.
Alexanderr Levchuk

Wauw rất đẹp thực sự! Hoạt động như mong đợi. Với shopt | grep extBạn có thể xem nếu plugin được kích hoạt.
nguy hiểm89

14
find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;

10

Thế còn:

mv A /tmp/
rm * -rf
mv /tmp/A .

Điều này tránh một số "sự khan hiếm" của một lỗi đánh máy trong các lệnh khác.


1
+1 để làm điều lành mạnh thay vì hy vọng các công cụ đủ thông minh. Tuy nhiên, vào một đêm nọ, khi tôi mới học Linux, tôi đã sao chép kernel vào / tmp trước khi thực hiện biên dịch lại lần đầu tiên. Nó không thành công, nhưng đã xóa cái cũ, vì vậy tôi đã nói 'không có mồ hôi, tôi có một bản sao' chỉ để thấy rằng một nhiệm vụ cron nửa đêm đã xóa nó với mọi tệp trong hơn một tuần trong / tmp! tôi đã phải biên dịch lại một lần nữa và lần này làm điều đó đúng, hoặc không khởi động lại cho tôi!
Javier

câu trả lời hay nhất được đăng :)
warren

3

Cái gì đó như

find . -type d -not -name A -exec rm -ir {} \;

nên làm.

biên tập

Nó thực sự nên

find . -type d -maxdepth 1 -not -name A -exec rm -ir {} \;

để ngăn chặn findđệ quy dưới A.


3
Nhưng, điều này cũng sẽ loại bỏ bất kỳ thư mục con nào bên dưới A như A / foo và A / bar, nhưng sẽ bảo toàn A / A.
TCampbell

Mát mẻ! Câu hỏi và câu trả lời được di chuyển từ SO sang SF ... nhưng bản chỉnh sửa của tôi ở trên đã bị mất ...
agnul

Sẽ tốt hơn khi trao đổi maxdepth và gõ các đối số như thế này: find. -maxdepth 1 -type d -not -name A -exec rm -ir {} \;
Spawnrider

1

tôi thường làm điều này bằng cách thực hiện một lệnh ls làm cho nó đúng trước. Tôi không ở máy unix, nhưng đại loại như:

ls -lda "[^ A]"

Một khi bạn đã làm đúng, chuyển nó thành một lệnh

ls -lda "[^ A]" | xargs rm -rf

Vui lòng chỉnh sửa ở trên nếu tôi có biểu hiện thường xuyên sai ...



1

Nếu bạn muốn linh hoạt hơn nhưng thủ công bạn có thể làm:

ls > /tmp/foo
edit /tmp/foo as you like
xargs -a /tmp/foo rm -r

Bằng cách đó bạn có thể làm chung munging.


1

Đây là một cách. Tuy nhiên, hãy cẩn thận với những thứ này, nó mạnh đến mức nó chỉ có thể được sử dụng cho mục đích tốt hay xấu ...

tìm * -type d | grep -v "^ A" | xargs rm -rf

1

Không sử dụng find vì một số người đã hiển thị với -exec và rm mà không chuyển -print0 để tìm và -0 đến xargs. Nó sẽ bị lẫn lộn trên tên tệp có dấu cách hoặc dòng mới:

$ mkdir 'foo foo'
$ mkdir foo$'\n'foo 
$ find . -type d -exec rm -ir {} \;
rm: cannot remove directory `.'
rm: remove directory `./foo\nfoo'? y
find: `./foo\nfoo': No such file or directory
rm: remove directory `./foo foo'? y
find: `./foo foo': No such file or directory

Thay vào đó, hãy sử dụng find -print0 với xargs -0, '-exec lệnh {} +' hoặc -delete nếu tìm thấy của bạn hỗ trợ nó.



1

Ngoài ví dụ trước về:

find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;

bạn cũng có thể làm:

find some/subdir -mindepth 1 -maxdepth 1 -type d -not -name A -exec rm -ir {} \;

để tránh phải cd some/subdirđầu tiê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.