Làm cách nào tôi có thể xóa các tệp chứa khoảng trắng đệ quy?


5

Tôi gặp một số rắc rối với lệnh này trong bash trong Ubuntu:

rm $(find . -name "*.exe")

Mục đích của tôi là xóa, đệ quy, tất cả các tệp kết thúc bằng .exe. Nhưng một số tệp có khoảng trắng và điều này phá vỡ lệnh.

Bất kỳ đề xuất về cách tiếp cận vấn đề này?

Câu trả lời:


16
find . -name "*.exe" -exec rm -f '{}' +

Cái này có find định dạng lệnh và đối số, và nó cẩn thận tránh xáo trộn tên (bằng cách chuyển từng tên làm đối số riêng rm ). '+' Có nghĩa là "thực hiện càng nhiều càng tốt trong một lần thực hiện rm ".


3
find(1)-delete hành động (có thể chỉ là GNU find only) sẽ lưu tất cả các quy trình con và các tùy chọn dòng lệnh rườm rà. find . -name '*.exe' -delete
camh

@camh: theo liên kết đến tài liệu POSIX; -delete Không bao gồm. Nó ở trong GNU find; câu hỏi dành cho Linux; vì vậy nó có thể sử dụng -delete. Tuy nhiên, tất cả thế giới không phải là Linux và có thể sử dụng một câu trả lời di động.
Jonathan Leffler

3

Bạn có thể dẫn đầu ra từ find vào xargs, chỉ định rằng chỉ các dòng mới nên được coi là dấu phân cách giữa các tên tệp:

find -name '*.exe' | xargs -d \\n rm

Cách dễ dàng hơn để làm điều này là sử dụng ký tự null làm dấu phân cách:

find -name '*.exe' -print0 | xargs -0 /bin/rm

Xem find Trang chủ của một ví dụ thực hiện điều này.

Một tùy chọn khác là sử dụng lệnh bạn đã sử dụng, nhưng để đặt dấu phân cách đối số nội bộ của bash thành chỉ dòng mới:

IFS=$'\n'; rm $(find . -name "*.exe");

Đây $'...' cấu trúc trích dẫn được sử dụng để tạo ra một ký tự dòng mới. Cách tiếp cận này sẽ ít khả năng phục hồi hơn trong trường hợp danh sách tên tệp dài hơn so với sử dụng xargs.


1
Không có điểm nào thực sự trong việc sử dụng bất cứ thứ gì ngoài -print0-0 lựa chọn; tên kia không hoạt động chính xác nếu tên chứa dòng mới (và đó là ký tự hợp lệ trong tên tệp Unix). Tương tự với hack IFS. Lưu ý rằng đây là các phần mở rộng dành riêng cho GNU (mặc dù rất nhạy cảm) theo tiêu chuẩn.
Jonathan Leffler

@Jonathan: Tôi thường sử dụng -d bản thân tôi chỉ vì nó ít gõ hơn và trong tên tập tin thực tế (ít nhất là đối với tôi) không bao giờ có dòng mới. Ngoài ra còn có lợi thế là bạn có thể lọc đầu ra của find thông qua các chương trình khác (grep, tail, v.v.) trước khi gửi nó đến xargs.
intuited

1

Đơn giản chỉ cần vượt qua -delete tùy chọn để find:

find . -name "*.exe" -delete

Điều này giúp bạn không phải trích dẫn và bất kỳ sự phức tạp nào về tên tệp và có thể nhanh hơn -exec bởi vì không có quá trình mới cần phải được sinh ra.


0

Thủ công thoát khỏi các nhân vật có thể giúp bạn.

find . -name "*.exe" | sed -s 's/\ /\\ /' | xargs rm -f

Không phải là một kỹ thuật đáng tin cậy; tất cả những thứ khác xargs chia tên ở chỗ trống. Bạn có thể sử dụng find . -name "*.exe" -print0 | xargs -0 rm -f, nơi -print0 kết thúc tên tệp bằng ASCII NUL và -0 có nghĩa là xargs đọc tên kết thúc bằng ASCII NUL. Lưu ý rằng đây là các phần mở rộng dành riêng cho GNU (mặc dù rất nhạy cảm) theo tiêu chuẩn.
Jonathan Leffler

@Jonathan Đúng .. Câu trả lời của bạn chắc chắn tốt hơn.
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.