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