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ấy
nhậ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ì)?