một đường ống (|) kết nối luồng đầu ra tiêu chuẩn của quy trình với luồng đầu vào tiêu chuẩn của quy trình khác. Bạn không thể sử dụng điều đó để chuyển danh sách tên tệp tới rừm trực tiếp, bởi vì rừm không đọc tên tệp từ đầu vào tiêu chuẩn của nó.
Bạn có thể sử dụng xargs chương trình để đọc danh sách trên nó là đầu vào tiêu chuẩn và "gói" tên tệp cho rừm:
ls -A | grep abcdef | xargs rm
nhưng đừng, có tất cả các loại vấn đề với cách tiếp cận này - đặc biệt là tiếng kêu xử lý đầu vào từng dòng, trong khi xargs phân chia đầu vào trên khoảng trắng theo mặc định. Bạn có thể làm cho nó tốt hơn bằng cách sử dụng một cái gì đó như
shopt -s dotglob # mô phỏng tập tin ẩn ls -A "gần như tất cả"
printf '%s\0' * | grep -z abcdef | xargs -0 rm
trong đó sử dụng ký tự null ASCII để phân tách tên tệp một cách rõ ràng. Một cách tiếp cận thường được ưa thích là sử dụng tìm thấy chỉ huy:
tìm thấy . -maxdepth 1 -name '*abcdef*' # -delete
(Tôi đã để lại -xóa bỏ đã nhận xét ngay bây giờ - đảm bảo hoàn toàn chắc chắn rằng đó là tìm thấynhập đúng tệp trước khi bỏ ghi chú vì không có thao tác "hoàn tác").
Lưu ý rằng tìm thấy đệ quy vào các thư mục con theo mặc định - nếu bạn muốn tương đương với ls -R sau đó loại bỏ -độ sâu tối đa 1. Bạn có thể thêm -loại f để chỉ tìm và xóa tệp (bỏ qua thư mục).
Cũng lưu ý rằng tìm tên sử dụng các mẫu toàn cầu shell thay vì các biểu thức chính quy được sử dụng bởi tiếng kêu (nó cũng có một -regex khớp vị ngữ nhưng điều đó dường như không cần thiết ở đây).
Xem thêm Tại sao không phải phân tích cú pháp ls (và thay vào đó phải làm gì)?