sử dụng rm để loại bỏ các tập tin và thư mục đệ quy


17

có thể sử dụng rm để loại bỏ các tệp và thư mục khớp với một mẫu đệ quy mà không cần sử dụng các lệnh khác không?

Câu trả lời:


35

Để trả lời trực tiếp câu hỏi của bạn, "không - bạn không thể làm những gì bạn mô tả với rm".

Bạn có thể , tuy nhiên, làm điều đó bạn kết hợp nó với find. Đây là một trong nhiều cách bạn có thể làm điều đó:

 # search for everything in this tree, search for the file pattern, pipe to rm
 find . | grep <pattern> | xargs rm

Ví dụ: nếu bạn muốn nuke tất cả các tệp * ~, bạn có thể làm như vậy:

 # the $ anchors the grep search to the last character on the line
 find . -type f | grep '~'$ | xargs rm

Để mở rộng từ một bình luận * :

 # this will handle spaces of funky characters in file names
 find -type f -name '*~' -print0 | xargs -0 rm

1
đúng - nếu bạn rời khỏi ống cuối cùng, bạn sẽ nhận được danh sách mọi thứ trước :)
warren

2
Có thể không trả lời trực tiếp câu hỏi của người đăng, nhưng là gần nhất họ sẽ nhận được những gì họ muốn.
Drakia

1
Một người lùn, không phải là một chút cay đắng vô cớ?
Gnoupi

10
Xin hãy cẩn thận khi sử dụng find | grep | xargs rm. Nếu có tệp có khoảng trắng (hoặc dòng mới), tệp này sẽ bị hỏng (và tùy thuộc vào tên tệp và vị trí của khoảng trắng) có thể xóa nội dung mà bạn không có ý định xóa. find … -print0 | xargs -0 rmsẽ mạnh mẽ hơn nhiều Tuy nhiên, điều đó có nghĩa là bạn không thể sử dụng grepvà phải sử dụng findcác vị từ để khớp và chỉ in các tệp mong muốn. ví dụ thứ hai của warren sẽ mạnh mẽ hơn như find -type f -name '*~' -print0 | xargs -0 rm.
Chris Johnsen

1
Nếu bạn muốn một lệnh duy nhất thực hiện công việc, hãy tạo bí danh bằng một trong các lệnh find được đưa ra. Sẽ điền vào một câu trả lời cho điều này sau, nếu muốn.
thường dân

8

"không sử dụng các lệnh khác"

Không.


Câu trả lời hay minh họa "trả lời đúng câu hỏi ban đầu (có nguy cơ không thể cung cấp giải pháp)" so với "cung cấp giải pháp, ngay cả khi nó không phù hợp với các hạn chế áp đặt".
Gnoupi

Tôi chỉ đăng bài này là "Một người lùn" đã phàn nàn về câu trả lời thực sự cung cấp một giải pháp. Không sử dụng các lệnh khác, thực sự không có cách nào để thực hiện xóa tệp đệ quy khớp với một mẫu, chỉ cần xóa tệp / thư mục hiện tại.
Drakia

3

Sử dụng Bash, với globstartập hợp, :

rm basedir/**/my*pattern*

Hãy thử với ví dụ ls -1trước, trước rmđể liệt kê các tệp bạn khớp.

Bạn đặt tùy chọn thông qua ví dụ shopt -s globstar.


Ngoài ra, một findbiến thể ngắn hơn :

find -type f -name 'my*pattern*' -delete

hoặc cho GNU find:

find -type f -name 'my*pattern*' -exec rm {} +

hoặc thay thế khác cho non-GNU find(chậm hơn một chút):

find -type f -name 'my*pattern*' -exec rm {} \;

Để cũng loại bỏ các thư mục, như bạn yêu cầu: chỉ cần thay đổi rmvào rm -rtrong các lệnh ở trên và bỏ qua khớp lệnh trên chỉ -type ftrong findlệnh.


0

Tôi sẽ có "rm -rf" liên tục ở đâu là sự kết hợp của tên tệp và các mẫu phù hợp như * và? v.v (vd: today_log_2009 ????. log). Điều đó sẽ bắt đầu từ Dir hiện tại và xử lý đệ quy các tệp macth mẫu đó.


Điều này sẽ không hoạt động vì mô hình được mở rộng bởi shell trong thư mục hiện tại. Nếu được trích dẫn, mẫu sẽ trở thành một tên tệp có các ký tự đặc biệt trong đó. ví dụ: để xóa tệp [, người ta có thể viết rm '['. Các mô hình chỉ đơn giản là mất ý nghĩa của nó.
thường dân

0

Nếu bạn sử dụng zsh (1) , hãy bật "mở rộng toàn cầu" bằng setopt extendedglob.zshrc. Tiền tố mẫu có '** /' sau đó sẽ xóa đệ quy:

% rm -rf ** / <mẫu>

Tuy nhiên, nếu có rất nhiều tệp cần xóa, bạn nên tìm đến (1) với xargs (1) hoặc -exec, và tôi cũng khuyên bạn nên làm điều đó trong shell script.

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.