จะทำอย่างไรถึงจะมีเพียงพื้นที่ว่างที่ไฟล์ใช้ซึ่งไม่ได้เชื่อมโยงไปถึงที่อื่น?


14

การใช้สrsync --link-destแนปชอตแบบประหยัดพื้นที่ฉันจะทราบได้อย่างไรว่าฉันได้บันทึกพื้นที่ว่างจำนวนเท่าใด หรือมากกว่าทั่วไป:

ทำอย่างไรจึงจะทราบได้ว่าไดเรกทอรีใช้พื้นที่เท่าใดในการพิจารณาเฉพาะไฟล์ที่ไม่ได้เชื่อมโยงกับที่อื่นนอกโครงสร้างไดเรกทอรี คำถามที่แตกต่าง: จำนวนพื้นที่จริงจะเป็นอิสระหลังจากการลบไดเรกทอรีนั้นหรือไม่ ( du -hsจะโกหกพื้นที่ที่จำเป็นสำหรับการเชื่อมโยงอาจรวมอยู่ด้วย)


2
โดยค่าเริ่มต้น GNU duจะนับขนาดไฟล์เพียงครั้งเดียวแม้ว่าจะเชื่อมโยงกันอย่างหนักเว้นแต่คุณจะใช้ตัวเลือก-l/ --count-linksคุณเรียกใช้duบนต้นไม้ทั้งหมดสองครั้งโดยมีและไม่มีตัวเลือกนั้นและความแตกต่างระหว่างขนาดควรเป็นจำนวนพื้นที่ที่คุณได้บันทึกไว้ในไดเรกทอรีทั้งหมด
jw013

คำตอบ:


9

สมมติว่าไม่มีฮาร์ดลิงก์ภายใน (นั่นคือทุกไฟล์ที่มีฮาร์ดลิงก์มากกว่า 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และผ่านมันไป วุ้ย.

(แต่ฉันจะใช้วิธีแรกที่ง่ายกว่าถ้ามันให้คำตอบที่ดีพอ)


ขอบคุณใช่ถ้าตอบสนองความต้องการนั้นใช้งานได้ แต่ถ้าไม่ใช่ล่ะ
Tobias Kienzler

ไม่สามารถใช้งานได้เนื่องจากไม่สามารถพิจารณาขนาดของไดเรกทอรีได้เอง (ซึ่งโดยทั่วไปจะมีลิงก์อย่างน้อย 2 ลิงก์และหากไม่มีให้ทำเช่นนั้นคุณจะต้องนับไฟล์เป็นสองเท่า)
Stéphane Chazelas

1
จากนั้นจำเป็นต้องใช้findเพื่อพิมพ์รายการไฟล์ทั้งหมดที่มี inodes และจำนวนลิงค์ จากนั้นจะรวมกันsort | uniq -cเพื่อให้ได้จำนวนครั้งที่แต่ละ inode ปรากฏในทรีแล้วกรองออกด้วยจำนวนลิงก์ที่มากกว่าจำนวนที่ปรากฏ ... จากนั้นป้อนรายการduนั้น แต่ถ้าเป็นไปตามข้อกำหนดให้ประหยัดความพยายามได้ดีกว่า
กัส

@StephaneChazelas มันใช้งานได้ แต่มันเป็นความจริงที่มันไม่ได้คำนึงถึงขนาดของไดเรกทอรี ถ้าduมี-dพารามิเตอร์ที่คล้ายคลึงกับlsของ ...
กัส

โปรดทราบว่าในbtrfsระบบไฟล์จำนวนลิงก์สำหรับไดเรกทอรีอยู่เสมอ1ดังนั้นคุณต้องเพิ่ม! -type d
Stéphane Chazelas

5

โดยทั่วไปคุณจะต้องได้รับหมายเลขไอโหนดและจำนวนลิงก์สำหรับไฟล์ทั้งหมด (ไม่ใช่ไดเรกทอรี) เปรียบเทียบจำนวนลิงก์นั้นกับจำนวนการเกิดขึ้นของแต่ละไอโหนดและหากมีความแตกต่างให้แยกไฟล์ออก

สมมติว่าพวกเขาทั้งหมดอยู่ในระบบไฟล์เดียวกันสิ่งนี้จะทำงานได้ (ด้วย GNU find):

find . -type d -printf '%k\n' -o -printf '%i %n %k\n' |
   awk '
     NF==1{t+=$0; next}
     {n1[$1]=$2; n2[$1]++; s[$1]=$3}
     END {
       for (i in n1)
         if (n1[i] == n2[i])
           t+=s[i]
       print t
     }'

ใช่สิ่งที่ฉันพูด (ขอบคุณสำหรับเครดิต) แต่ความแม่นยำที่เพิ่มขึ้นที่คุณได้รับจากการนับไดเรกทอรีคุณเสียไปโดยการเพิ่มการใช้ดิสก์ที่ไม่แน่นอน
กัส

@angus คุณหมายถึงอะไร "การใช้งานดิสก์ที่ไม่แน่นอน"?
Stéphane Chazelas

ไม่มีอะไรฉันผิดทั้งหมดเกี่ยวกับสิ่งที่%kรายงาน เยี่ยมมากduไม่จำเป็นเลย! ฉันจะอัปเดตคำตอบเมื่อกลับถึงบ้าน ขอบคุณ!
กัส

3

du อันที่จริงจะไม่โกหก;) มันแยกวิเคราะห์ dir (s) หนึ่งให้มันนับเฉพาะครั้งแรกของการเชื่อมโยงทั้งหมดที่ชี้ไปที่ inode เดียวกันมันพบ

หากคุณถามduสิ่งที่เห็นในไดเรกทอรีเดียวเท่านั้นมันไม่สนใจว่าจะมีฮาร์ดลิงก์อื่น ๆ ที่ชี้ไปที่เนื้อหาเดียวกัน:

$ du -h daily.0 && du -hc daily.1
29G /daily.0
29G /daily.1

ตอนนี้ให้มัน dirs ในแถวเดียวกัน (เริ่มต้นด้วยล่าสุดสำหรับการสำรองข้อมูลที่เพิ่มขึ้นด้วย rsync ด้วย--link-dest):

$ du -hc daily.0 daily.1
29G /daily.0
364M /daily.1
29G total

หรือ dir สำรองทั้งหมด:

$ du -hc --max-depth=1 /snapshots
29G /daily.0
364M /daily.1
537M /daily.2
333M /daily.3
30G total

ไฟล์ใด ๆ ใน 'daily.1' ที่อ้างอิงถึง inode (หรือที่รู้จักว่าไฟล์ "ของจริง") ที่อ้างอิงแล้วใน 'daily.0' จะไม่ถูกนับ

ดังนั้นการลบรายวัน 1 จะบันทึก 364MB ในอุปกรณ์ของคุณ

นำออก

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