นี่คือเวอร์ชันที่เรียบง่ายพร้อมคำอธิบายเพิ่มเติมสำหรับผู้เริ่มต้นเช่นฉันที่พยายามเรียนรู้วิธีใส่คำสั่งมากกว่าหนึ่งคำในหนึ่งบรรทัด
หากคุณเขียนปัญหาเป็นขั้นตอนจะมีลักษณะดังนี้:
// For every file in this directory
// Check the filetype
// If it's an ASCII file, then print out the filename
เพื่อให้บรรลุนี้เราสามารถใช้คำสั่งสามยูนิกซ์: find
, และfile
grep
find
จะตรวจสอบทุกไฟล์ในไดเร็กทอรี
file
จะให้ประเภทไฟล์แก่เรา ในกรณีของเราเรากำลังมองหาการส่งคืน "ข้อความ ASCII"
grep
จะมองหาคำหลัก 'ASCII' ในผลลัพธ์จาก file
แล้วเราจะรวมสิ่งเหล่านี้เข้าด้วยกันเป็นบรรทัดเดียวได้อย่างไร? มีหลายวิธีในการทำ แต่ฉันพบว่าการทำตามลำดับรหัสหลอกของเรานั้นเหมาะสมที่สุด (โดยเฉพาะกับผู้เริ่มต้นอย่างฉัน)
find ./ -exec file {} ";" | grep 'ASCII'
ดูซับซ้อน แต่ก็ไม่เลวเมื่อเราทำลายมันลง:
find ./
= ดูทุกไฟล์ในไดเร็กทอรีนี้ find
คำสั่งพิมพ์ออกมาชื่อไฟล์ของไฟล์ใด ๆ ที่ตรงกับ 'การแสดงออก' หรืออะไรก็ตามมาหลังจากเส้นทางซึ่งในกรณีของเราคือไดเรกทอรีปัจจุบันหรือ./
สิ่งที่สำคัญที่สุดที่ต้องเข้าใจคือทุกอย่างหลังจากนั้นบิตแรกจะถูกประเมินว่าเป็นจริงหรือเท็จ หากเป็น True ชื่อไฟล์จะถูกพิมพ์ออกมา ถ้าไม่เช่นนั้นคำสั่งจะถูกย้ายไป
-exec
= แฟล็กนี้เป็นตัวเลือกภายในคำสั่ง find ที่อนุญาตให้เราใช้ผลลัพธ์ของคำสั่งอื่นเป็นนิพจน์การค้นหา มันเหมือนกับการเรียกใช้ฟังก์ชันภายในฟังก์ชัน
file {}
= คำสั่งที่ถูกเรียกภายในfind
. file
คำสั่งกลับสตริงที่จะบอกคุณ filetype ของไฟล์ที่ โดยปกติจะมีลักษณะดังนี้: file mytextfile.txt
. ในกรณีของเราเราต้องการให้ใช้ไฟล์ใดก็ตามที่find
คำสั่งดูอยู่ดังนั้นเราจึงใส่วงเล็บปีกกา{}
เพื่อทำหน้าที่เป็นตัวแปรว่างหรือพารามิเตอร์ กล่าวอีกนัยหนึ่งเราแค่ขอให้ระบบส่งออกสตริงสำหรับทุกไฟล์ในไดเร็กทอรี
";"
= สิ่งนี้จำเป็นโดยfind
และเป็นเครื่องหมายวรรคตอนที่ท้าย-exec
คำสั่งของเรา ดูคู่มือสำหรับ 'พบ' man find
สำหรับคำอธิบายมากขึ้นถ้าคุณจำเป็นต้องใช้มันโดยการเรียกใช้
| grep 'ASCII'
= |
เป็นท่อ ไปป์เอาเอาต์พุตของสิ่งที่อยู่ทางซ้ายและใช้เป็นอินพุตของสิ่งที่อยู่ทางขวา ใช้เอาต์พุตของfind
คำสั่ง (สตริงที่เป็นประเภทไฟล์ของไฟล์เดียว) และทดสอบเพื่อดูว่ามีสตริง'ASCII'
หรือไม่ ถ้าเป็นเช่นนั้นจะส่งคืนจริง
ตอนนี้นิพจน์ทางด้านขวาของfind ./
จะคืนค่าจริงเมื่อgrep
คำสั่งส่งคืนจริง Voila
find . -type f -exec grep -Il "" {} \;
ไฟล์.