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ó 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:
Để 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
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 rm
sẽ mạnh mẽ hơn nhiều Tuy nhiên, điều đó có nghĩa là bạn không thể sử dụng grep
và phải sử dụng find
cá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
.
"không sử dụng các lệnh khác"
Không.
Sử dụng Bash, với globstar
tập hợp, có :
rm basedir/**/my*pattern*
Hãy thử với ví dụ ls -1
trướ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 find
biế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 rm
vào rm -r
trong các lệnh ở trên và bỏ qua khớp lệnh trên chỉ -type f
trong find
lệnh.
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 đó.
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.