xóa thư mục con mà không xóa thư mục cha


15

Đối với loại cấu trúc dir này:

/config/filegroups/filegroupA/files/fileA1.txt
/config/filegroups/filegroupA/files/fileA2.txt
/config/filegroups/filegroupB/files/fileB1.txt
/config/filegroups/filegroupB/files/fileB2.txt
...

Tôi biết rằng tôi có thể sử dụng rm -rf /config/filesgroupsđể xóa thư mục mẹ và tất cả các thư mục con ...

nhưng tôi muốn xóa chỉ /filegroupA, /filegroupBvv, và không xóa/config/filegroups


13
Có vấn đề gì khi sử dụng rm -rf / config / filesgroups / * không?
dsmsk80

3
Hoặc thậm chí có thể rm -rf /config/filegroups/filegroups{A,B}?
Drav Sloan

@dsumsky Theo mặc định bashkhông bao gồm '.' thư mục mở rộng tên đường dẫn. Mà có thể hoặc không thể mong muốn. Bản thân tôi làm shopt -s dotglobtrong .bashrcviệc sửa chữa đó. Chỉ cần một lưu ý phụ là ai đó có thể thấy hữu ích;).
Miroslav Koškár

Có bất kỳ o fthis làm việc cho bạn? Nếu vậy, bạn có phiền khi chấp nhận một câu trả lời, để giúp đỡ những người khác (thích tôi), những người muốn làm điều tương tự?
Mawg nói rằng phục hồi Monica

rm -rf /*sẽ làm;) --- nghiêm túc không làm điều đó
Muhammad Umer

Câu trả lời:


28
rm -rf /config/filegroups/*

Nếu bạn muốn xóa chỉ thư mục (và liên kết tượng trưng đến thư mục), để lại bất kỳ tệp nào trong /config/filegroupskhông bị ảnh hưởng, bạn có thể sử dụng dấu gạch chéo:

rm -rf /config/filegroups/*/

Nếu bạn cũng muốn xóa các thư mục có tên bắt đầu bằng một .giả định, giả sử bạn có một bash khá gần đây, bạn nên sử dụng tùy chọn shell dotglob:

shopt -s dotglob
rm -rf /config/filegroups/*/
shopt -u dotglob

và xin vui lòng không rằng nó sẽ không hoạt động cho rm -rf "/ config / filegroups / *"
Ilya Yevlampiev

5

Điều này sẽ xóa tất cả các tệp và thư mục trong /config/filegroupsđó bao gồm các tệp và thư mục "ẩn" (tên bắt đầu bằng .).

find /config/filegroups -mindepth 1 -maxdepth 1 | xargs rm -rf

Nếu tên tệp hoặc thư mục chứa khoảng trắng, bạn phải làm như thế này:

find /config/filegroups -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf

Phần thưởng: trước tiên bạn có thể kiểm tra những gì sẽ bị xóa như thế này:

find /config/filegroups -mindepth 1 -maxdepth 1

Nếu bạn muốn giữ một số tệp hoặc thư mục nhất định, bạn có thể làm như thế này:

find /config/filegroups -mindepth 1 -maxdepth 1 -not -name "keep"

Có lý do nào đó không sử dụng find's -deletelựa chọn?
evilsoup

4
-deletetừ chối xóa các thư mục không trống. -maxdepthghi đè -depth, cần thiết -deleteđể xóa các thư mục không trống. Nếu không -maxdepthbạn không thể dễ dàng xem thư mục nào sẽ bị xóa vì nó cũng liệt kê các tệp bên trong thư mục. Không sử dụng -maxdepthcũng có nghĩa là bạn không thể dễ dàng sử dụng các bộ lọc như -name. Hơn nữa, -deletexóa các thư mục bằng cách xóa tất cả các đối tượng bên trong đầu tiên, có thể mất nhiều thời gian nếu đó là một cây lớn và sâu.
lesmana

4

Tôi thích sử dụng findvới -exec, điều đó sẽ làm cho cuộc gọi của bạn giống như thế này:

find /config/filegroups/ -maxdepth 1 -mindepth 1 -type d -exec rm -rf {} \;

-2

Nếu bạn đã có trong thư mục, bạn chỉ cần gõ rm -rf ./**

Vì thế:

cd /config/filesgroups
rm -rf ./**

Đây là mô hình toàn cầu để xóa tất cả các thư mục con khỏi đường dẫn cục bộ ..

./đề cập đến thư mục cục bộ ... và **cho tất cả các thư mục bên dưới ..


1
Thư mục nào và tại sao `**` `
RalfFriedl

1
Điều này sẽ giống hệt như rm -rf ./*, ngoại trừ việc bạn có thể nhận được thông báo chẩn đoán về "Không có tệp hoặc thư mục như vậy" nếu bạn không sử dụng -ftrong lệnh của mình (vì thư mục trên cùng sẽ bị xóa đệ quy trước khi nội dung của nó được xử lý bởi rm).
Kusalananda
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.