เมื่อนับจำนวนบรรทัดด้วย wc อย่าพิมพ์ข้อผิดพลาดเมื่อใดก็ตามที่เป็นไดเรกทอรี


12

ฉันต้องการนับจำนวนบรรทัดทั้งหมดใน/etcไฟล์ทั้งหมดแต่ไม่ใช่ไฟล์ในไดเรกทอรีย่อยดังนั้นฉันจึงพิมพ์: wc -l /etc/* | tail -1และผลลัพธ์เป็นดังนี้:

xxxx is a directory 
yyyy is a directory
total 1752

คำถามของฉันคือฉันจะกำจัด (ลบ) ความคิดเห็นเหล่านี้ได้อย่างไรและมีวิธีที่ดีกว่าในการนับประเภทนี้อย่างไร


1
ฉันคิดว่าการใช้ find ไม่ใช่ไม่ใช่ไรท์ 100% เพราะใน / etc ไม่เพียง แต่ไฟล์ปกติ f เท่านั้น แต่ยังเชื่อมโยง l ด้วย ดังนั้นเวอร์ชั่นนี้ดีกว่ามาก: $ sudo wc -l / etc / * 2> / dev / null | tail -1
Hamza

คำตอบ:


14

คุณสามารถส่งข้อความข้อผิดพลาดไปที่ / dev / null

$ wc -l /etc/* 2>/dev/null | tail -1

ด้วยคำสั่งนี้คุณจะเห็นจำนวนบรรทัดในไฟล์ที่อ่านได้ทั่วโลกเท่านั้น sudoหากต้องการดูจำนวนบรรทัดของไฟล์ทั้งหมดที่คุณจะต้องมีการยกระดับคำสั่งด้วย

$ sudo wc -l /etc/* 2>/dev/null | tail -1

8

แยกไฟล์และเรียกใช้ 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ควรเป็นส่วนหนึ่งของนิสัยในการจัดการกับไฟล์เพื่อหลีกเลี่ยงการประมวลผลชื่อไฟล์ที่ยาก สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการอ่านเรียงความวิธีจัดการกับชื่อไฟล์อย่างถูกต้อง


5

find ทำอย่างง่ายดาย:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*')

เอาท์พุท:

...
828 /etc/mime.types
25 /etc/ts.conf
66 /etc/inputrc
 0 /etc/subgid-
8169 total

แต่ถ้าคุณเพียงแค่ต้องการจำนวนเป็นเอาท์พุทและไม่มีอะไรอื่น:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | grep total | awk '{print $1}'

แก้ไข : newlinesข้อผิดพลาดkosกล่าวว่ามีชัย ใช้เพียง-execแก้ไขมัน นอกจากนี้ยัง/etcไม่มีไฟล์ดังกล่าว

เอาท์พุท:

8169

ตามที่ชี้โดยkosคำสั่งดังกล่าวสามารถลดลงเป็น:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | awk 'END {print $1}'

แก้ไข : newlinesข้อผิดพลาดkosกล่าวว่ามีชัย ใช้เพียง-execแก้ไขมัน นอกจากนี้ยัง/etcไม่มีไฟล์ดังกล่าว

เอาท์พุท:

8169

4
มีจุดประสงค์-iname '*'อะไร? ไม่findตรงกับทุกอย่างเป็นค่าเริ่มต้น
ขับเหล็ก

@steeldriver - '*'มันไม่ได้ทำงานสำหรับฉันโดยไม่ต้อง
Raphael

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.