วิธีรับขนาดโฟลเดอร์โดยไม่สนใจการเชื่อมโยงอย่างหนัก


17

ฉันใช้ rsnapshot สำหรับการสำรองข้อมูลซึ่งสร้างชุดของโฟลเดอร์ที่มีไฟล์ชื่อเดียวกัน ไฟล์บางไฟล์เชื่อมโยงกันอย่างหนักในขณะที่ไฟล์อื่นแยกออกจากกัน ตัวอย่างเช่นhourly.1/file1และhourly.2/file1อาจเชื่อมโยงอย่างหนักกับไฟล์เดียวกันในขณะที่hourly.1/file2และhourly.2/file2เป็นไฟล์ที่แยกจากกันโดยสิ้นเชิง

ฉันต้องการค้นหาจำนวนพื้นที่ที่โฟลเดอร์ใช้เพื่อhourly.2 เพิกเฉยต่อไฟล์ใด ๆ ที่เป็นลิ้งค์ไปยังไฟล์hourly.1ต่างๆ ดังนั้นในตัวอย่างข้างต้นฉันอยากได้ขนาดของ file2 แต่ไม่สนใจ file1

ฉันใช้ bash บน linux และฉันต้องการทำสิ่งนี้จากบรรทัดคำสั่งให้ง่ายที่สุดเท่าที่จะทำได้ดังนั้นจึงไม่มีโซลูชันกราฟิกหรือระบบปฏิบัติการอื่น ๆ

คำตอบ:


7

ขนาดรวมเป็นไบต์ของไฟล์ทั้งหมดhourly.2ที่มีเพียงลิงค์เดียว:

$ find ./hourly.2 -type f -links 1 -printf "%s\n" | awk '{s=s+$1} END {print s}'

จากfindหน้าคน:

   -links n
          File has n links.

ในการรับผลรวมเป็นกิโลไบต์แทนที่จะใช้ไบต์ให้ใช้ -printf "%k\n"

หากต้องการแสดงรายการไฟล์ที่มีจำนวนลิงก์ต่างกันให้เล่นโดยใช้find -links +1(มากกว่าหนึ่งลิงก์) find -links -5(น้อยกว่าห้าลิงก์) และอื่น ๆ


1
หากไฟล์บางไฟล์ที่มีฮาร์ดลิงก์ไปยังไฟล์ในhourly2คำสั่งของคุณจะดำเนินการตามคำตอบที่ไม่ถูกต้อง
cuonglm

@Gnouc - ใช่แล้ว - ขึ้นอยู่กับว่าไฟล์จะมาลงเอยhourly.2อย่างไร หากพวกเขาถูกคัดลอกที่นั่นพวกเขาจะไม่มีลิงค์พิเศษและคำสั่งของฉันจะทำงาน หากพวกเขาเชื่อมโยงอย่างชัดเจนมันจะล้มเหลว ฉันสมมติว่ามีการคัดลอกไฟล์สำรองใหม่
grebneke

11

หากคุณต้องการเฉพาะขนาดของไฟล์ที่มีอยู่ภายใต้hourly.2แต่ไม่อยู่ภายใต้คุณสามารถได้รับมันน้อยทางอ้อมด้วยhourly.1 duหากduประมวลผลไฟล์เดียวกันมากกว่าหนึ่งครั้ง (แม้จะอยู่ภายใต้ชื่อที่แตกต่างกันเช่นฮาร์ดลิงก์) มันจะนับเฉพาะไฟล์ในครั้งแรกเท่านั้น ดังนั้นสิ่งที่du hourly.1 hourly.2รายงานhourly.2คือขนาดที่คุณกำลังมองหา ดังนั้น:

du -ks hourly.1 hourly.2 | sed -n '2s/[^0-9]*//p'

(ทำงานบนระบบ POSIX และตัวแปร Unix อื่น ๆ ส่วนใหญ่ถือว่าชื่อไดเรกทอรีhourly.1ไม่มีบรรทัดใหม่ใด ๆ )


ด้วยเหตุผลแปลก ๆ บางอย่าง du ไม่ได้สังเกตเห็นไฟล์ hardlinked บน RHEL5 - ถ้าฉันทำ 'du -sh dir / sub dir' ผลลัพธ์สำหรับ dir นั้นเหมือนกับถ้าฉันเพิ่งพูดว่า 'du -sh dir' - ไม่รวมขนาด ของ 'dir / sub'
Andreas Krey

9

ดังที่ @Gilles พูดว่าเนื่องจากduนับเฉพาะ hardlinks แรกที่ชี้ไปที่ inode เดียวกันกับที่พบคุณจึงสามารถให้ไดเรกทอรีในแถว:

$ du -hc --max-depth=0 dirA dirB
29G /hourly.1
 1G /hourly.2
30G total

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


2
ตามdu --helpตัวเลือก--max-depth = 0เทียบเท่ากับ-sดังนั้นข้างบนสามารถย่อให้สั้นลงเป็น:$ du -hcs dirA dirB
akavel

2

ง่ายขึ้น

du -hc --max-depth=1 path/

ตัวอย่าง

9.4G    daily/users/rockspa/home/daily.21
3.6G    daily/users/rockspa/home/daily.30
4.2G    daily/users/rockspa/home/daily.11
1.1G    daily/users/rockspa/home/daily.4
4.2G    daily/users/rockspa/home/daily.9
3.0G    daily/users/rockspa/home/daily.25
3.5G    daily/users/rockspa/home/daily.20
4.2G    daily/users/rockspa/home/daily.13
913M    daily/users/rockspa/home/daily.5
2.8G    daily/users/rockspa/home/daily.26
1.4G    daily/users/rockspa/home/daily.1
2.6G    daily/users/rockspa/home/daily.28
4.2G    daily/users/rockspa/home/daily.15
3.8G    daily/users/rockspa/home/daily.19
327M    daily/users/rockspa/home/daily.8
4.2G    daily/users/rockspa/home/daily.17
3.1G    daily/users/rockspa/home/daily.23
...

ขอบคุณ Abdel นี่ควรเป็นคำตอบที่ยอมรับได้
TiberiusKirk

น่ากลัว สิ่งนี้ใช้ได้กับฉันในการลองครั้งแรกกับ macOS 10.15 ขอขอบคุณ.
dimitarvp

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