Để 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 file
lệ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 file
theo 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 file
hoạt động của -part:
- Vị
-exec
ngữ thực thi sh -c 'file -b $0 | grep -q text' FILENAME
cho 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ế $0
bằng tên tệp.
- Các
file
chươ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 -b
ngăn chặn tùy chọn in tên của mỗi tập tin thử nghiệm.
grep
lọc đầu ra đến từ file
chươ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 file
lệnh trông như thế nào.)
- Nhưng
grep
không xuất văn bản đã lọc, vì nó có -q
tù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
để find
và đó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 ,
-print
lệnh được thực thi (tức là tên của tệp được kiểm tra được in).