ในการกรองชื่อไฟล์ที่มนุษย์อ่านได้คุณสามารถใช้ชื่อคลาสอักขระ[:print:]
( พิมพ์ได้ ) คุณจะพบมากขึ้นเกี่ยวกับการเรียนดังกล่าวในคู่มือสำหรับgrep
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
ในความคิดที่สองข้อกำหนด "ที่มนุษย์อ่านได้" อาจอ้างถึงเนื้อหาของไฟล์แทนที่จะเป็นชื่อ กล่าวอีกนัยหนึ่งคุณจะค้นหาไฟล์ข้อความ นั่นเป็นเรื่องยุ่งยากเล็กน้อย ตามที่ @D_Bye แนะนำไว้ในความคิดเห็นคุณควรใช้file
คำสั่งเพื่อกำหนดประเภทเนื้อหาไฟล์ แต่มันจะไม่เป็นการดีถ้าจะเรียกใช้file
หลังจากไพพ์เพราะมันจะทำให้งานของการแสดงชื่อไฟล์มีความซับซ้อน นี่คือสิ่งที่ฉันแนะนำ:
find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print
นี่เป็นวิธีสั้น ๆ ว่าfile
ส่วนที่ทำงานอย่างไร:
- เพรดิเคต
-exec
จะดำเนินการsh -c 'file -b $0 | grep -q text' FILENAME
สำหรับแต่ละFILENAME
ที่เป็นไปตามเงื่อนไขก่อนหน้านี้ทั้งหมด (ชนิด, ขนาด, ไม่สามารถเรียกใช้งานได้)
- สำหรับแต่ละไฟล์เชลล์ (
sh
) จะเรียกใช้สคริปต์สั้น ๆ นี้: file -b $0 | grep -q text
แทนที่$0
ด้วยชื่อไฟล์
file
โปรแกรมกำหนดชนิดเนื้อหาของแต่ละไฟล์และผลข้อมูลเหล่านี้ -b
ตัวเลือกที่ป้องกันไม่ให้พิมพ์ชื่อของแฟ้มการทดสอบแต่ละ
grep
กรองเอาท์พุทที่มาจากfile
โปรแกรมค้นหาบรรทัดที่มีข้อความ "" (ดูด้วยตัวคุณเองว่าลักษณะทั่วไปของfile
คำสั่งเป็นอย่างไร)
- แต่
grep
จะไม่ส่งออกข้อความที่ถูกกรองเนื่องจากมี-q
ตัวเลือก (เงียบ) สิ่งที่มันไม่เป็นเพียงการเปลี่ยนแปลงของสถานะออกไปทั้ง0
(ซึ่งหมายถึง "ความจริง" - ข้อความกรองพบ) หรือ 1 (หมายถึง "ข้อผิดพลาด" - ข้อความ"ข้อความ"ไม่ปรากฏในการส่งออกจากfile
)
- สถานะการออกจริง / เท็จที่มาจาก
grep
นั้นจะถูกส่งต่อไปsh
ยังfind
และทำหน้าที่เป็นผลลัพธ์สุดท้ายของการ-exec sh -c 'file $0 | grep -q text' {} \;
ทดสอบทั้งหมด " "
- ในกรณีที่ผลการทดสอบดังกล่าวข้างต้นกลับเป็นความจริงที่
-print
คำสั่งจะถูกดำเนินการ (เช่นชื่อของไฟล์ที่ผ่านการทดสอบจะถูกพิมพ์)