ซับเดี่ยวนี้ดูเหมือนว่าจะเป็นวิธีที่แข็งแกร่งพอสมควร:
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c
find . -type f -printf '%f\n'
พิมพ์ basename ของไฟล์ปกติทุกคนในต้นไม้กับไดเรกทอรีไม่มี ที่ไม่ต้องกังวลเกี่ยวกับไดเรกทอรีที่อาจมี.
อยู่ในพวกเขาในsed
regex ของคุณ
sed -r -n 's/.+(\..*)$/\1/p'
แทนที่ชื่อไฟล์ที่เข้ามามีเพียงการขยาย เช่นจะกลายเป็น.somefile.ext
.ext
หมายเหตุเริ่มต้น.+
ใน regex; ผลนี้ในการแข่งขันใด ๆ .
ต้องอย่างน้อยหนึ่งตัวก่อนของส่วนขยาย สิ่งนี้จะป้องกันไม่ให้ชื่อไฟล์เหมือน.gitignore
ถูกมองว่าไม่มีชื่อเลยและนามสกุล '.gitignore' ซึ่งอาจเป็นสิ่งที่คุณต้องการ ถ้าไม่ได้แทนที่ด้วย.+
.*
ส่วนที่เหลือของสายมาจากคำตอบที่ได้รับการยอมรับ
แก้ไข : หากคุณต้องการฮิสโตแกรมที่เรียงลำดับอย่างดีในรูปแบบแผนภูมิ Paretoเพียงเพิ่มอีกหนึ่งsort
ส่วนท้าย:
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c | sort -bn
เอาต์พุตตัวอย่างจากแผนผังซอร์ส Linux ที่สร้างขึ้น:
1 .1992-1997
1 .1994-2004
1 .1995-2002
1 .1996-2002
1 .ac
1 .act2000
1 .AddingFirmware
1 .AdvancedTopics
[...]
1445 .S
2826 .o
2919 .cmd
3531 .txt
19290 .h
23480 .c