นี่คือเวอร์ชันที่เรียบง่ายพร้อมคำอธิบายเพิ่มเติมสำหรับผู้เริ่มต้นเช่นฉันที่พยายามเรียนรู้วิธีใส่คำสั่งมากกว่าหนึ่งคำในหนึ่งบรรทัด
หากคุณเขียนปัญหาเป็นขั้นตอนจะมีลักษณะดังนี้:
// For every file in this directory
// Check the filetype
// If it's an ASCII file, then print out the filename
เพื่อให้บรรลุนี้เราสามารถใช้คำสั่งสามยูนิกซ์: find, และfilegrep
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 "" {} \;ไฟล์.