สมมติว่าไม่มีฮาร์ดลิงก์ภายใน (นั่นคือทุกไฟล์ที่มีฮาร์ดลิงก์มากกว่า 1 ลิงก์เชื่อมโยงจากนอกต้นไม้) คุณสามารถทำได้:
find . -links -2 -print0 | du -c --files0-from=-
แก้ไขและนี่คือสิ่งที่ฉันร่างในความคิดเห็นที่นำไปใช้ เท่านั้นโดยไม่du
; kudos ถึง @StephaneChazelas สำหรับการสังเกตdu
ไม่จำเป็น คำอธิบายในตอนท้าย
( find . -type d -printf '%k + ' ; \
find . \! -type d -printf '%n\t%i\t%k\n' | \
sort | uniq -c | \
awk '$1 >= $2 { print $4 " +\\" }' ; \
echo 0 ) | bc
สิ่งที่เราทำคือการสร้างสตริงที่มีการใช้งานดิสก์ (เป็น KB) ของไฟล์ที่เกี่ยวข้องทุกไฟล์คั่นด้วยเครื่องหมายบวก จากนั้นเราให้อาหารที่นอกเหนือจากbc
นั้น
การfind
เรียกใช้ครั้งแรกทำเช่นนั้นสำหรับไดเรกทอรี
วินาทีfind
พิมพ์จำนวนลิงค์ inode และการใช้ดิสก์ เราส่งผ่านรายการนั้นsort | uniq -c
เพื่อรับรายการ (จำนวนสิ่งที่ปรากฏในทรีจำนวนการเชื่อมโยง inode การใช้ดิสก์)
เราส่งรายการนั้นผ่านawk
และหากฟิลด์แรก (# ของสิ่งที่ปรากฏ) มากกว่าหรือเท่ากับสอง (# ของฮาร์ดลิงก์) หมายความว่าไม่มีลิงก์ไปยังไฟล์นี้จากนอกต้นไม้ดังนั้นพิมพ์ฟิลด์ที่สี่ ( การใช้งานดิสก์) พร้อมเครื่องหมายบวกและแบ็กสแลชที่แนบ
ในที่สุดเราเอาท์พุท0
ดังนั้นสูตรที่ถูกต้องไวยากรณ์ (มันจะ en ใน+
อื่น ๆ ) bc
และผ่านมันไป วุ้ย.
(แต่ฉันจะใช้วิธีแรกที่ง่ายกว่าถ้ามันให้คำตอบที่ดีพอ)
du
จะนับขนาดไฟล์เพียงครั้งเดียวแม้ว่าจะเชื่อมโยงกันอย่างหนักเว้นแต่คุณจะใช้ตัวเลือก-l
/--count-links
คุณเรียกใช้du
บนต้นไม้ทั้งหมดสองครั้งโดยมีและไม่มีตัวเลือกนั้นและความแตกต่างระหว่างขนาดควรเป็นจำนวนพื้นที่ที่คุณได้บันทึกไว้ในไดเรกทอรีทั้งหมด