Làm thế nào để chỉ xóa các tập tin, nhưng giữ cấu trúc thư mục?


16

Tôi muốn xóa mọi tập tin, nhưng giữ cấu trúc thư mục. Là có một cách?

LƯU Ý: (Tôi đang sử dụng GNU bash 4.1.5).


1
Làm thế nào chính xác là bạn có nghĩa là "loại trừ"? Bạn đang sử dụng một lệnh nào đó? Nếu vậy xin vui lòng cập nhật câu hỏi của bạn để bao gồm điều này.
slm


Tôi nghĩ bạn có nghĩa là xóa mọi tập tin.
slm

1
@slm Tôi đã cập nhật với lệnh tôi thường sử dụng để loại trừ các tệp.
Tom Brito

Không, bạn không có :-) Hoặc, nếu bạn đã làm như vậy, bạn đã xóa nó một lần nữa
Mawg nói rằng phục hồi Monica

Câu trả lời:


17

Thử đi:

find . ! -type d -exec rm '{}' \;

Điều này sẽ xóa mọi tập tin duy nhất, ngoại trừ các thư mục, bên dưới thư mục làm việc hiện tại. Hãy cực kỳ cẩn thận với lệnh này.

Nếu phiên bản findtrên máy của bạn hỗ trợ, bạn cũng có thể sử dụng

find . ! -type d -delete

@slm: Tôi không chắc nó di động thế nào. Tôi đã thêm nó vào như là một tùy chọn phụ. Tôi chỉ nhận ra rằng bản chỉnh sửa của mình khiến câu trả lời của tôi gần giống với câu trả lời của bạn. Xin lỗi vì điều đó; đó không phải là ý định của tôi

Liệu '{}' có bảo vệ chống lại khoảng trắng trong tệp không? Tôi thấy bạn sử dụng tất cả thời gian và tôi không nghĩ rằng tôi đã từng thấy nó được sử dụng trước khi tôi thấy bạn đăng giải pháp với nó.
slm

Từ trang tìm kiếm GNU: "Lưu ý rằng các dấu ngoặc nhọn được đặt trong các dấu ngoặc đơn để bảo vệ chúng khỏi sự diễn giải dưới dạng dấu chấm câu shell." Tôi không chắc chắn khi nó cần thiết mặc dù. Tôi chủ yếu làm điều đó theo thói quen. Các findlệnh không bao giờ nhìn thấy dấu ngoặc kép. Nó chỉ xem {}điểm đánh dấu là một đối số.

Tôi thấy nó trên ví dụ, nhưng các mẫu hiển thị này, " -exec command {} +" & this " -exec command ;". Tôi đã sử dụng \;trong quá khứ không bao giờ là '{}'.
slm

@slm: Các mẫu cũng không hiển thị thoát dấu chấm phẩy, thường là cần thiết khi sử dụng shell để thực thi find. Tôi nghĩ rằng các mẫu có nghĩa là hiển thị các đối số mà findlệnh cần và đừng lo lắng về bất kỳ thứ gì liên quan đến shell.

7

Bạn có thể sử dụng lệnh findđể định vị mọi tệp nhưng duy trì cấu trúc thư mục:

$ find /some/dir -type f -exec rm {} +

Theo câu hỏi và câu hỏi về Unix & Linux này có tiêu đề: gnu tìm và che dấu {} cho một số shell - cái nào? , thoát khỏi {}dấu tích đơn ( ') dường như không còn cần thiết nữa với các shell hiện đại như Bash.


1

Cách dễ dàng để xóa mọi tệp thông thường trong thư mục hiện tại và thư mục con theo cách đệ quy:

zsh -c 'rm **/*(.)'

Chỉ zsh có vòng loại toàn cầu để khớp các tệp theo loại. Tuy nhiên, rmlệnh không hoạt động trên các thư mục, vì vậy trong bash, bạn có thể sử dụng

shopt -s globstar
rm **/*

Điều này không làm việc cho các lệnh khác hơn rmmặc dù. Nói chung, bạn có thể sử dụng find:

find . -type f -delete

hoặc nếu bạn findkhông hỗ trợ -delete:

find . -type f -exec rm {} +

-2

Tôi có yêu cầu tương tự để xóa các tệp khỏi một đường dẫn và các thư mục con của nó (lọc theo thời gian) mà không xóa cấu trúc thư mục.

Và tôi đã sử dụng định dạng dưới đây làm việc cho tôi.

tìm / test123 / home / test_file_hip / data / nfs -mtime +6 -type f -exec rm {} \;

Cú pháp: find (đường dẫn của tệp) -mtime (lớn hơn hoặc ít hơn ngày) -type f -exec rm {} \;

-type: Đề cập loại tệp "f" cho thư mục "d" -exec: thực thi lệnh rm: remove {}: đầu ra của lệnh find

Lưu ý: Hãy kiểm tra nó trước khi sử dụng nó. Xin vui lòng sửa hoặc cập nhật nếu tôi bỏ lỡ bất cứ điều gì.


1
vì đây là một yêu cầu bổ sung không được OP đề cập và vì find ... rmcấu trúc cơ bản đã được đề cập, tôi không chắc đây là một đóng góp có giá trị như một Câu trả lời mới cho câu hỏi này.
Jeff Schaller
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.