Để được tư vấn chung về việc xử lý tên tệp có khả năng chứa khoảng trắng, hãy xem Tại sao tập lệnh shell của tôi bị nghẹt trên khoảng trắng hoặc các ký tự đặc biệt khác?
Khó khăn với những gì bạn đang cố gắng làm là không có cách nào hay để liệt kê N tệp gần đây nhất với các công cụ tiêu chuẩn.
Cách dễ nhất để làm những gì bạn đang làm ở đây là sử dụng zsh làm vỏ của bạn. Nó có vòng loại toàn cầu để sắp xếp các tập tin theo ngày. Để chạy filetrên 500 tệp gần đây nhất:
file *(om[1,500])
Với filetiện ích Linux , vượt qua -ihoặc --mime-typetùy chọn để có được đầu ra dễ phân tích hơn. Các tập tin hình ảnh được xác định bởi các dòng kết thúc bằng image/something.
file --mime-type *(om[1,500]) | sed -n 's~: *image/[^ ]*$~~p'
Nếu bạn cần đối phó hoàn toàn với tất cả các tên tệp, bao gồm cả những tên có dòng mới trong tên của chúng, hãy sử dụng -0tùy chọn cho đầu ra được phân tách bằng null. Các phiên bản gần đây của GNU sed có thể sử dụng byte rỗng làm dấu phân cách bản ghi thay vì dòng mới.
file --mime-type -- *(om[1,500]) | sed -zn 's~: *image/[^ ]*$~~p'
Nếu bạn không có zsh, bạn có thể sử dụng lsvà đối phó với các tên tệp có chứa khoảng trắng nhưng không phải là dòng mới hoặc dấu cách bằng cách chuyển -L1tùy chọn đến file. Điều này được gọi filetrên một tệp tại một thời điểm, vì vậy nó hơi chậm.
ls -t | head -n 500 | xargs -L1 file --mime-type -- | sed -n 's~: *image/[^ ]*$~~p'
xargstriển khai phổ biến , ví dụ, dấu phân cách có thể được thay đổi'\n'. Điều này thường hữu ích khi đầu vào không được tạo bởifind. Xem-d(GNU) và-E(OSX)