แยกไฟล์และเรียกใช้ wc บนพวกเขา
อะไรคือสิ่งwc -l /etc/*
ที่*
จะขยายไปยังรายการทั้งหมดภายใน/etc/
ไดเรกทอรี ดังนั้นเป้าหมายคือการแยกไฟล์และดำเนินการwc
กับพวกเขา มีหลายวิธีที่จะทำเช่นนั้น
สำหรับการวนซ้ำพร้อมการทดสอบ
test
คำสั่งหรือบ่อยครั้งมากขึ้นโดยย่อว่า[
สามารถนำมาใช้เพื่อค้นหาว่ารายการเป็นไฟล์ปกติเช่นดังนั้น:
[ -f "$FILE" ]
ดังนั้นสิ่งที่เราสามารถทำได้คือวนซ้ำไอเท็มทั้งหมดใน/etc/
และรันwc
บนไอเท็มเหล่านั้นหากคำสั่งด้านบนส่งคืนจริง ชอบมาก
for i in /etc/*; do [ -f "$i" ] && wc -l "$i" ; done
หา
นอกจากนี้เรายังสามารถใช้find
กับ-maxdepth
, -type
และ-exec
ธง
find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} +
-maxdepth
แจ้งให้ทราบว่าลึกลงไปในโครงสร้างไดเรกทอรีที่จะไป; ค่า 1 หมายถึงเฉพาะไฟล์ในไดเรกทอรีที่เราต้องการ
-type f
บอกให้ค้นหาไฟล์ปกติหรือ (แทนด้วย-o
แฟล็ก) สำหรับลิงก์ sybolic (แทนด้วยtype l
) ความดีทั้งหมดนั้นอยู่ในวงเล็บซึ่ง()
หนีออกมา\
เพื่อให้เชลล์ตีความพวกเขาเป็นส่วนหนึ่งของfind
คำสั่งแทนที่จะเป็นอย่างอื่น
-exec COMMAND {} +
โครงสร้างที่นี่รันคำสั่งอะไรก็ตามที่เราให้ไว้โดย+
ระบุให้นำไฟล์ที่พบทั้งหมดและสิ่งที่พวกเขาเป็นบรรทัดคำสั่ง args ไปยังคำสั่ง
ในการผลิตทั้งหมดเราสามารถส่งออกท่อได้tail
เช่นนี้
$ find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} + | tail -n 1
[sudo] password for xieerqi:
11196 total
ด้านโน้ต
ง่ายกว่าที่จะใช้wc -l /etc/* 2>/dev/null | tail -1
เช่นเดียวกับในคำตอบของ LD James แต่find
ควรเป็นส่วนหนึ่งของนิสัยในการจัดการกับไฟล์เพื่อหลีกเลี่ยงการประมวลผลชื่อไฟล์ที่ยาก สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการอ่านเรียงความวิธีจัดการกับชื่อไฟล์อย่างถูกต้อง