हार्ड लिंक को अनदेखा करते हुए फ़ोल्डर का आकार कैसे प्राप्त करें?


17

मैं बैकअप के लिए rsnapshot का उपयोग करता हूं, जो समान नाम की फ़ाइलों वाले फ़ोल्डरों की एक श्रृंखला उत्पन्न करता है। कुछ फाइलें हार्ड लिंक्ड हैं, जबकि अन्य अलग हैं। उदाहरण के लिए, hourly.1/file1और hourly.2/file1कठिन, एक ही फाइल से जोड़ा जा सकता है, जबकि hourly.1/file2और hourly.2/file2पूरी तरह से अलग फ़ाइलें हैं।

मैं किसी भी फाइल की hourly.2 अनदेखी करने वाले फ़ोल्डर द्वारा उपयोग की जाने वाली जगह की मात्रा का पता लगाना चाहता हूं जो कि फाइलों की हार्ड लिंक हैं hourly.1। इसलिए उपरोक्त उदाहरण में, मैं फ़ाइल 2 का आकार प्राप्त करना चाहता हूं, लेकिन फ़ाइल 1 को अनदेखा करें।

मैं लाइनक्स पर बैश का उपयोग कर रहा हूं, और मैं इसे कमांड लाइन से बस यथा संभव करना चाहता हूं, इसलिए कोई बड़ा चित्रमय या अन्य-ओएस-ओनली समाधान न करें।

जवाबों:


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 सिस्टम और अधिकांश अन्य यूनिक्स वेरिएंट पर काम करता है। मान लें कि निर्देशिका नाम hourly.1में कोई नई पंक्ति नहीं है)


कुछ अजीब कारण के लिए du हमेशा RHEL5 पर हार्डलिंक की गई फाइलों को नोटिस नहीं करता है - अगर मैं 'du -sh dir / sub dir' करता हूं तो dir के लिए आउटपुट वैसा ही है जैसे कि मैंने सिर्फ 'du -sh dir' कहा है - आकार को छोड़कर नहीं 'दिर / उप' का।
एंड्रियास क्रे

9

जैसा कि @Gilles कहते हैं, चूंकि duकेवल सभी हार्डलिंक्स में से सबसे पहले गिना जाता है, जो एक ही इनकोड की ओर इशारा करता है, आप इसे एक पंक्ति में निर्देशिका दे सकते हैं:

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

यानी 'hourly.2' में किसी भी फाइल को 'hrly.1' में पहले से संदर्भित एक इनोड (उर्फ "वास्तविक" फाइल) का संदर्भ देते हुए, गिना नहीं जाएगा।


2
के अनुसार du --help , विकल्प --max गहराई = 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
...

धन्यवाद अब्देल। यह स्वीकृत उत्तर होना चाहिए।
TiberiusKirk

बहुत बढ़िया। यह मेरे लिए मेरी macOS 10.15 पर पहली कोशिश पर काम किया। धन्यवाद।

1

Awesomely बिजीबॉक्स के समर्थन के findबिना आता है -printf। यहाँ @ grebneke के उत्तर में संशोधन किया गया है :

find . -type f -links 1 -exec ls -l {} \;| awk '{s=s+$5} END {print s}'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.