Làm cách nào để tôi loại bỏ đệ quy các thư mục con và tệp, nhưng không phải thư mục cha đầu tiên?


13

Tôi có thể sử dụng cách sau để xóa thư mục đích và đệ quy tất cả các thư mục con và nội dung của nó.

find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf

Tuy nhiên, tôi không muốn thư mục đích bị xóa. Làm cách nào tôi có thể xóa chỉ các tệp trong mục tiêu, thư mục con và nội dung của chúng?

Câu trả lời:


11

Câu trả lời trước là gần như đúng. Tuy nhiên, bạn không nên trích dẫn các ký tự toàn cầu shell nếu bạn muốn chúng hoạt động. Vì vậy, đây là lệnh bạn đang tìm kiếm:

rm -rf "/target/directory with spaces/"*

Lưu ý rằng * nằm ngoài dấu ngoặc kép. Hình thức này cũng sẽ hoạt động:

rm -rf /target/directory\ with\ spaces/*

Nếu bạn có *dấu ngoặc kép như hình trên, thì nó sẽ chỉ cố gắng xóa tệp duy nhất có tên theo nghĩa đen *trong thư mục đích.


1
Điều này không hoạt động với các tập tin và thư mục ẩn. Tôi đã phải làm điều đó một lần nữa với một
Con mèo bất khuất

8

Thêm ba lựa chọn.

  1. Sử dụng findvới -mindepth 1-delete:

    Các cấp độ chính
    Không áp dụng bất kỳ thử nghiệm hoặc hành động nào ở các cấp độ nhỏ hơn các cấp độ (một số nguyên không âm).
    Indmindepth 1 có nghĩa là xử lý tất cả các tệp ngoại trừ các đối số dòng lệnh.

    -delete
    file Xóa; đúng nếu loại bỏ thành công. Nếu loại bỏ thất bại, một thông báo lỗi được đưa ra. Nếu delete thất bại, trạng thái thoát của find sẽ không khác (khi cuối cùng nó thoát). Sử dụng −delete tự động bật tùy chọn −depth.
    Kiểm tra cẩn thận với tùy chọn -depth trước khi sử dụng tùy chọn này.

    # optimal?
    # -xdev      don't follow links to other filesystems
    find '/target/dir with spaces/' -xdev -mindepth 1 -delete
    
    # Sergey's version
    # -xdev      don't follow links to other filesystems
    # -depth    process depth-first not breadth-first
    find '/target/dir with spaces/' -xdev -depth -mindepth1 -exec rm -rf {} \;
    



2. Sử dụng find, nhưng với các tập tin, không phải thư mục. Điều này tránh sự cần thiết phải rm -rf:

    # delete all the files;
    find '/target/dir with spaces/' -type f -exec rm {} \;

    # then get all the dirs but parent
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -exec rmdir {} \;

    # near-equivalent, slightly easier for new users to remember
    find '/target/dir with spaces/' -type f -print0 | xargs -0 rm
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -print0 | xargs -0 rmdir



3. Đi trước và xóa thư mục mẹ, nhưng tạo lại nó. Bạn có thể tạo một hàm bash để thực hiện điều này bằng một lệnh; Đây là một lót đơn giản:

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'

2

Làm thế nào về

rm -rf /target/directory\ path/*

Nếu có thể có tập tin bắt đầu với. trong thư mục đích.

rm -rf "/target/directory path/*" "/target/directory path/.??*"

Thứ hai này sẽ phù hợp với tất cả mọi thứ bắt đầu với một., Ngoại trừ. và .. Nó sẽ thất bại với những cái tên như .a, nhưng điều đó không phổ biến lắm. Nó có thể được điều chỉnh nếu cần thiết để bao gồm tất cả các trường hợp.


Tôi đã thử cả hai và họ không làm việc cho tôi. Có lẽ đó là vì đường dẫn thư mục đích của tôi có khoảng trắng trong đó? rm -rf '/ target / đường dẫn thư mục / *' Nó không có lỗi, nhưng các thư mục con vẫn còn.
Michael Prescott

Bạn cần phải thoát các khoảng trắng, bằng dấu gạch chéo ngược (\) trước dấu cách hoặc bằng cách đặt toàn bộ tên thư mục trong dấu ngoặc kép ("). Tôi đã chỉnh sửa các ví dụ để hiển thị điều này.
KeithB

Cảm ơn, tôi đã thử điều đó như thể hiện trong bình luận trước đây của tôi và vẫn không đi. (Tôi đang sử dụng OS X, có vấn đề gì không?)
Michael Prescott

OS X sẽ hoạt động tốt, đó là những gì tôi đang sử dụng. Hãy chắc chắn rằng bạn không sử dụng dấu gạch chéo ngược và dấu ngoặc kép. Chỉ một hoặc khác.
KeithB

Vâng, chỉ cần sử dụng dấu ngoặc kép. Nếu tôi loại bỏ dấu * và vì vậy tôi chỉ sử dụng rm -rf "/ target / thư mục đường dẫn /" thư mục "đường dẫn thư mục" sẽ bị xóa cùng với các thư mục con "đường dẫn thư mục". Nếu tôi sử dụng đường dẫn rm -rf "/ target / thư mục / *", không có gì xảy ra.
Michael Prescott

2
find /target/directory/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;
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.