Để lọc tên tệp có thể đọc được của con người, bạn có thể sử dụng tên lớp ký tự[:print:] ( có thể in ) . Bạn sẽ tìm thấy nhiều hơn về các lớp như vậy trong hướng dẫn cho .grep
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
Về ý nghĩ thứ hai, yêu cầu "có thể đọc được của con người" có thể đề cập đến nội dung của tệp, thay vì tên của nó. Nói cách khác, bạn sẽ tìm kiếm các tệp văn bản . Đó là một chút khó khăn hơn. Như @D_Bye đề xuất trong một nhận xét, sau đó bạn nên sử dụng filelệnh để xác định loại nội dung tệp. Nhưng nó không phải là một ý tưởng tốt để chạy filetheo một đường ống, bởi vì nó sẽ làm phức tạp nhiệm vụ hiển thị tên của tệp. Đây là những gì tôi đề nghị:
find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print
Đây là ngắn gọn cách thức filehoạt động của -part:
- Vị
-execngữ thực thi sh -c 'file -b $0 | grep -q text' FILENAMEcho từng FILENAMEđiều kiện thỏa mãn tất cả các điều kiện trước đó (loại, kích thước, không thể thực thi).
- Đối với mỗi tệp đó, shell (
sh) chạy tập lệnh ngắn này : file -b $0 | grep -q text, thay thế $0bằng tên tệp.
- Các
filechương trình xác định loại nội dung của mỗi tập tin và kết quả đầu ra thông tin này. Các -bngăn chặn tùy chọn in tên của mỗi tập tin thử nghiệm.
greplọc đầu ra đến từ filechương trình, tìm kiếm các dòng có chứa "văn bản" . (Xem cho chính mình, một đầu ra điển hình của filelệnh trông như thế nào.)
- Nhưng
grepkhông xuất văn bản đã lọc, vì nó có -qtùy chọn (im lặng) được cung cấp. Những gì nó làm, chỉ là thay đổi trạng thái thoát của nó thành 0(đại diện cho "true" - văn bản đã lọc được tìm thấy) hoặc 1 (có nghĩa là "lỗi" - văn bản "văn bản" không xuất hiện trong đầu ra từ file).
- Các đúng / sai trạng thái thoát đến từ
grepđược truyền hơn nữa bằng cách shđể findvà đóng vai trò như là kết quả cuối cùng của toàn bộ " -exec sh -c 'file $0 | grep -q text' {} \;" thử nghiệm.
- Trong trường hợp kiểm tra trên trả về đúng ,
-printlệnh được thực thi (tức là tên của tệp được kiểm tra được in).