แสดงรายการส่วนขยายที่ไม่ซ้ำกันทั้งหมดสำหรับไฟล์ที่มีอยู่ในไดเรกทอรี


11

ฉันต้องการดูส่วนขยายที่ไม่ซ้ำกันทั้งหมดของไฟล์ที่อยู่ในไดเรกทอรีที่แน่นอน คำสั่งที่จะทำเช่นนั้นในทุบตีคืออะไร?

หนึ่งสามารถใช้การได้รับไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันแล้วตัดส่วนขยายและท่อมันfind . -type f uniqวิธีที่ง่ายที่สุดในการดึงส่วนขยายคืออะไร

คำตอบ:


15

ลองสิ่งนี้:

find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$|\1|p' | sort -u

มันไม่มีผลกับ:

  • ไฟล์ที่ไม่มีนามสกุล
  • ไฟล์ที่มีชื่อที่ลงท้ายด้วยจุด
  • ไฟล์ที่ซ่อน

sort | uniq -cนอกจากนี้ยังอาจเป็นประโยชน์กับท่อมัน


ใช้งานไม่ได้กับรุ่นเริ่มต้นบน Mac ของฉัน ฉันได้รับsed: illegal option -- r
dzhelil


3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

ทำงานบน OS X ยกเว้นไฟล์ที่ไม่มีนามสกุล โฟลเดอร์ดาวน์โหลดของฉัน:

DS_Store
dmg
exe
localized
msi
nib
plist
pmproj
rar
tgz
txt
webloc
zip

คุณอาจต้องการsed -rแทน


ปัญหาเล็กน้อย: ไฟล์ที่ไม่มีนามสกุลพิมพ์ชื่อ ไฟล์ที่ซ่อน (เช่น.DS_Store) พิมพ์ชื่อโดยไม่ต้องนำ.หน้า


ผมอยากแนะนำให้แทนsort -u sort | uniqการตีน้อยและการใช้ทรัพยากร
John T

ขอบคุณ @John พยายามเก็บไว้ใน "กรอบ" ของ celil ดังนั้นฉันจึงไม่คิด
Daniel Beck

[]ก็ไม่จำเป็นที่จะหลบหนีอยู่ภายในจุด
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

3

ต่อไปนี้เป็นโซลูชันอื่นที่ไม่สับสนโดยชื่อไฟล์ที่มีการขึ้นบรรทัดใหม่แบบฝังและใช้sort -uzในการเรียงลำดับนามสกุลไฟล์ที่ถูกต้องซึ่งอาจมีการขึ้นบรรทัดใหม่ด้วย:

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
   printf "%s\000" "${@##*.}" # get the extensions and nul-terminate each of them
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n' | 
nl

3

วิธีที่รวดเร็วและง่ายต่อการจดจำแถบส่วนขยายคือสมมติว่าชื่อไฟล์ทั้งหมดมีรูปแบบ "name.ext" จากนั้นใช้:

 ls -1 | cut -d"." -f2- | sort | uniq -c

สิ่งนี้ให้นับจำนวนส่วนขยายเฉพาะที่มีตัวอย่างเช่น:

   1 sh  
   3 txt  
   4 txt.Z  
  17 dat  
  72 dat.gz  

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