Làm thế nào để loại bỏ chỉ nội dung của các thư mục?


14

Tôi đang ở trong một thư mục : /var/myfolder.

Bên trong có một số thư mục khác như: /var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/vv

Bên trong mỗi cái có một số tập tin với tên ngẫu nhiên. Làm cách nào để xóa tất cả các tệp khỏi tất cả các thư mục bên trong /var/myfolder?

Cấu trúc (tất cả các thư mục, ví dụ: A, B, C, v.v., bên trong /var/myfolder) nên được giữ nguyên.

Câu trả lời:


17

Thử:

find /var/myfolder -type f -delete

Điều này nhận được tất cả các tệp thông thường trong / var / myfolder và xóa chúng chỉ để lại các thư mục.


Cảm ơn giải pháp. Tôi nên đề cập rằng tôi đang làm điều này trong Solaris 9, vì vậy phát hiện của tôi không có tùy chọn -delete, nhưng đó là một điểm khởi đầu tốt.
IroeN

2
Tôi đã có thể đưa ra một giải pháp sau: find / var / myfolder -type f -exec rm -f {} \;
IroeN

2
Lấy làm tiếc. Tôi sử dụng Debian hoặc Ubuntu. Giải pháp của bạn là tương đương theo như tôi biết.
StarNamer

6
-type f! =! -type d
mikeerv

7

Với zsh, hãy sử dụng . vòng loại toàn cầu để chỉ khớp với các tệp thông thường:

rm -- **/*(.)

Thao tác này sẽ xóa tất cả các tệp thông thường (không bị ẩn) trong thư mục hiện tại và các thư mục con của nó theo cách đệ quy. Thêm Dvòng loại toàn cầu để xóa các tệp thông thường ẩn (và các tệp thông thường trong các thư mục ẩn).


Tôi đang sử dụng bash.
IroeN

1
@ user6554: ... mà cả câu hỏi và thẻ được sử dụng của bạn không chỉ ra;)
0xC0000022L


3
find . -depth -exec rm {} + 2>/dev/null

rm không xóa thư mục - vì vậy chỉ cần chạy nó trên mọi thứ.

Để giữ liên kết tượng trưng đến thư mục:

find .  ! -type d -exec sh -c '
    for f do [ -d  "$f" ] || 
          set "$@" "$f";  shift
    done; rm  "$@"' sh  {} +

Và tôi nghĩ rằng điều này cũng sẽ hoạt động, có lẽ, một cách tối ưu hóa một chút nếu có nhiều tệp có thể cần thử nghiệm trong phiên bản trên:

find . ! \( -type l -o -type d \)  \
-exec  rm {} + -o -exec  sh -c '
       for f do [ -d "$f" ] ||
       unlink "$f";done' sh {} +

Lưu ý rằng GNU findcó một -xtypetùy chọn cho điều đó.
Stéphane Chazelas

@ StéphaneChazelas - ast cũng vậy. Nhưng tôi không cần -depth, tôi không nghĩ. tôi đã giữ nó trong top đầu để tránh rất nhiều cuộc gọi lỗi - im lặng hoặc không - nhưng đó chỉ là những điều ngớ ngẩn ở những người khác.
mikeerv

1
# This will delete all directory contents, including hidden files and
# subdirectories, without deleting the directory itself

# With GNU find:
find /path/to/directoryToEmpty -mindepth 1 -delete

# OpenBSD (and probably other BSDs)
find /path/to/directoryToEmpty -mindepth 1 -depth -exec rm -f {} \;

# To see what it deletes, in the order it will delete it:
find /path/to/directoryToEmpty -mindepth 1 -depth -print

0
rm var/myfolder/*/*

Sẽ xóa mọi thứ bên trong các thư mục con mà không cần chạm vào các thư mục phụ.

Đầu tiên *là dành cho các thư mục con của myfolderbản thân ( A, B, ...). Thứ hai *là cho các tập tin trong A, Bvv

NẾU có nhiều thư mục bên trong A, Bvv Đầu tiên chạy: rm /var/myfolder/*/*/*sau đó chạy rm /var/myfolder/*/*.


0

Bạn cũng có thể cd vào đầu cây thư mục được đề cập, sau đó chạy:

find . -type f -print0 | xargs -0 rm -rf

và điều đó sẽ xóa tất cả các tệp trong khi giữ nguyên cây thư mục. Tùy chọn -print0 và -0 có thể được bỏ qua nếu bạn tự tin rằng bạn không có bất kỳ tên tệp hoặc thư mục nào chứa khoảng trắng.

Lệnh find phân biệt giữa các tệp (-type f) và các liên kết (-type l) vì vậy điều này sẽ giữ nguyên các liên kết, nếu có. Không được thử nghiệm mặc dù. Nếu nghi ngờ, hãy chạy:

tìm thấy . -type l

và xem nếu có bất cứ điều gì xuất hiện trước khi bạn chạy lệnh find trước đó.


Bạn có thể giải thích làm thế nào rmcờ -r, -R, --recursive - remove directories and their contents recursivelyphù hợp với điều này?
Stephen Rauch

Bởi vì chúng tôi không chạy rm -rf, chúng tôi đang chạy find. -type f và sau đó dẫn đầu ra từ đó đến rm -rf. Vì vậy, nó chỉ loại bỏ các tập tin, nó không chạm vào các thư mục. Đó là những gì | xargs bit nào, nó lấy đầu ra từ lệnh bên trái và gửi nó đến lệnh bên phải.
rjh427

Quan điểm của tôi chính xác. Nếu bạn không vượt qua bất kỳ thư mục nào, sử dụng cờ nào chỉ hoạt động trên các thư mục?
Stephen Rauch

Bởi vì bộ nhớ cơ, và nó vẫn hoạt động. Bạn có thể đưa ra sự phản đối tương tự đối với tùy chọn "lực lượng", tôi sẽ cho bạn câu trả lời tương tự.
rjh427

-2

Đơn giản chỉ cần sử dụng lệnh dưới đây:

sudo rm -rf thư mục_in_which_you_have_content / *

---------------- HOẶC LÀ --------------------------------- -----------------------

'*' Là viết tắt của tất cả vì vậy khi bạn sử dụng * sẽ xóa tất cả nội dung. Vì vậy, hoặc sử dụng lệnh như thế này hoặc đi đến thư mục mà bạn muốn xóa tất cả nội dung và chỉ sử dụng lệnh dưới đây:

sudo 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.