सबसे बड़ी फ़ाइलों या निर्देशिकाओं का पता लगाएं


10

कौन सी कमांड सभी फाइलों और निर्देशिकाओं के आकार को tmp निर्देशिका (छिपे हुए वाले सहित) में प्रिंट करेगी और उन्हें मानव पठनीय प्रारूप (जैसे 2 GB) में सबसे बड़े से छोटे आकार में क्रमबद्ध करेगी?

आउटपुट निम्नानुसार हो सकता है:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

मैंने lsऔर duकमांड का उपयोग करने की कोशिश की, लेकिन सही स्विच खोजने में सक्षम नहीं था।

जवाबों:


7

यहां एक त्वरित समाधान है, डु + सॉर्ट का उपयोग करें। इसे इस्तेमाल करे:

du -smc * | sort -n

यह छिपी हुई फ़ाइलों को अनदेखा करेगा, लेकिन यह एक और आसान तरीका है:

du -smc .[^.] .??* * | sort -n

यह चेतावनी दे सकता है कि उपरोक्त पैटर्न में से एक या अधिक फ़ाइल से मेल नहीं खाते हैं। पहले पैटर्न के .[^.]साथ शुरू होने वाले सभी दो चरित्र फ़ाइलनामों से मेल खाता है। को छोड़कर .., दूसरा पैटर्न, .??*सभी तीन अक्षर या अधिक फ़ाइल नाम के साथ शुरू होता है। और * उन सभी फ़ाइलों से मेल खाता है, जिनके साथ शुरू नहीं हो रहा है। एक अधिक परिष्कृत सूची के लिए जैसे कि संपूर्ण फाइलसिस्टम में X की तुलना में सभी फ़ाइल बड़ी है, या फाइलसिस्टम वृद्धि की सूची बनाए रखने के लिए, मेरे पास कुछ DIY शेल स्क्रिप्ट है जो मैंने लिखा है और यदि आपकी रुचि हो तो साझा कर सकते हैं।


धन्यवाद। मुझे आपकी स्क्रिप्ट में दिलचस्पी है अगर आप इतने दयालु होंगे।
xralf

1
उपयोग करें sort -nrयदि आप शीर्ष पर सबसे बड़ा मान चाहते हैं।
लॉरेंस

3

/tmpआकार के अनुसार क्रमबद्ध फ़ाइलों को कहीं भी सूचीबद्ध करने के लिए :

find /tmp -type f -exec du -k {} + | sort -k1n -k2

फ़ाइलों और निर्देशिका पेड़ों की सूची को तुरंत /tmpआकार के अनुसार क्रमबद्ध करें:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

सभी फ़ाइलों और निर्देशिका पेड़ों को सूची में कहीं भी /tmpआकार के अनुसार क्रमबद्ध करें:

du -ak /tmp | sort -k1n -k2

(तीन कमांड के बीच अंतर को स्पष्ट करने के लिए एक उदाहरण: यदि कोई फ़ाइल है /tmp/dir/file, तो पहली कमांड सूची /tmp/dir/file, दूसरी सूची /tmp/dirऔर तीसरी सूची दोनों।)

ऊपर के सभी कमांड किलोबाइट्स में आकार दिखाते हैं। जबकि GNU du "मानव-पठनीय" आकार (k, M, G, आदि गुणक के साथ) का उत्पादन कर सकते हैं, उन्हें छांटना एक और मामला है। हाल ही में पर्याप्त GNU कोरुटिल्स (.47.4) कर सकते हैं: बस के du -kसाथ du -hऔर sort -k1n -k2साथ बदलें sort -k1h -k2। अन्यथा, यहाँ प्रत्यय आकार (नीचे गोलाई) में परिवर्तित करने के लिए एक क्रूड ऑक स्क्रिप्ट है; बस sortइसके ऊपर आउटपुट को पाइप करें ।

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'

धन्यवाद। वे कमांड उपयोगी हैं, लेकिन मैं केवल tmp के तहत सीधे फाइलों और निर्देशिकाओं में दिलचस्पी रखता हूं, उपनिर्देशिकाओं में फाइलें नहीं
xralf

1
@xralf: फिर duकॉल के केवल दूसरे रूप का उपयोग करें।
गिल्स एसओ- बुराई को रोकें '

अच्छा लग रहा है, लेकिन बेहतर परिणाम एमबी और जीबी के साथ है जैसे कि फोर्सफेक पोस्ट किया गया है।
xralf

3

मैं इसके लिए अन्य उपनाम का उपयोग कर रहा हूं: alias ds='du -x --all --max-depth=1 . | sort -n'

यह सभी फाइलों के आकार और वर्तमान dir के 1-सेंट स्तर उपनिर्देशिकाओं को प्रिंट करता है।


यह अच्छा लघु समाधान है, लेकिन यह केवल निर्देशिकाओं को प्रिंट करता है।
xralf

ओह, क्षमा करें, आप सही हैं। मैंने फ़ाइलों के साथ इस समस्या का सामना नहीं किया है। हॉवियर, मैंने पाया है कि इसे फ़ाइलों के साथ कैसे काम करना है: --all swicth का उपयोग करना।
आरवीएस

महान सही समाधान। p पेंगुइनin359 थोड़ा बेहतर है क्योंकि यह एमबी में आकार दिखाता है। सबसे अच्छा ताकत का समाधान होगा, लेकिन उसका समाधान रिक्त स्थान के साथ निर्देशिकाओं को छोड़ देता है।
xralf

1

गन्नू सॉर्ट के मौजूदा संस्करण के साथ (और @ p पेंगुइनin359 फ़ाइल पैटर्न उधार)

cd /tmp; du -sShc .[^.] .??* * | sort -h

सॉर्ट के पुराने संस्करण के साथ

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

संपादित करें: उप-श्रेणियों को शामिल नहीं करने के लिए जोड़ा -S पैरामीटर du


मैं फ़ाइलों और निर्देशिकाओं (डेटा के कुल आकार) द्वारा उपयोग किए जाने वाले डिस्क स्थान को सीधे tmp (उपनिर्देशिका नहीं) के तहत चाहता था। मेरी सॉर्ट कमांड में -h विकल्प नहीं है।
xralf

मुझे 100% यकीन नहीं है कि आपका क्या मतलब है, क्योंकि आपने पहले ही फ़ाइल पैटर्न के चयन के साथ उत्तर स्वीकार कर लिया है। मेरे पोस्ट को संपादित करने के लिए उपखंड शामिल नहीं हैं। यदि आप स्पष्ट आकार चाहते हैं और वास्तविक डिस्क स्थान का उपयोग नहीं किया है, तो आप --apparent-sizeडु मापदंडों में जोड़ सकते हैं ।
जुलाई को संदंश

अब यह अच्छा काम करता है। मुझे केवल जीबी और फिर एमबी की तलाश करनी है, लेकिन यह कोई समस्या नहीं है।
xralf

मेरे पास गलत क्रम में यूनिट पत्र थे, जो अब तय हो गए हैं। यदि आप बड़े से छोटे के लिए ऑर्डर चाहते हैं, तो यूनिट अक्षरों के क्रम को बदलें और -r को सॉर्ट करें।
जुलाई को फोर्सफेक

मैंने देखा, यह निर्देशिका का आकार (बिना उपसर्ग के) प्रिंट करना भूल गया
xralf

0

अद्यतन: मैंने पिछली स्क्रिप्ट को हटा दिया है। यहाँ एक नया संस्करण है, प्रयोग duऔर awk (पिछले एक इस्तेमाल किया treeऔर sed)

यह आउटपुट है: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

यहाँ स्क्रिप्ट है

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#

जब आप सभी फ़ाइलों और निर्देशिकाओं के आकार कहते हैं , तो क्या आपका मतलब है कि प्रत्येक आइटम डिस्क पर ले जाता है (उदाहरण के लिए, मेरे Ubuntu ext4 फाइलसिस्टम पर, एक खाली निर्देशिका 4k डिस्क-स्थान लेता है, और 4k से छोटी फ़ाइल 4k तक ले जाती है । न्यूनतम आबंटन चंक 4k है) .. या आप प्रत्येक फ़ाइल में डेटा की मात्रा का मतलब है , जैसे, 100 (बाइट्स) .. और निर्देशिका के लिए, क्या आप उस निर्देशिका में फ़ाइल डेटा का कुल जानना चाहते हैं .. यदि आप फ़ाइलों के अंदर डेटा का आकार चाहते हैं , तो treeवह करता है। यदि आप डिस्क-स्थान का उपयोग करना चाहते हैं, तो duवह करता है ... ( treeएक निर्देशिका कुल नहीं है)
पीटर।

'डु' बेहतर विकल्प है ... मैंने अभी देखा है man du, कि यह "स्पष्ट फ़ाइल आकार" की भी रिपोर्ट कर सकता है .... The apparent size of a file is the number of bytes reported by wc -c 'नियमित फाइल पर, या अधिक सामान्यतः, ls -l --block-size=1' or स्टेटफॉर्म -% s '। उदाहरण के लिए, एक फाइल जिसमें शब्द हैzoo' with no newline would, of course, have an apparent size of 3.
पीटर।

मैं फ़ाइलों और निर्देशिकाओं (डेटा का कुल आकार) द्वारा उपयोग किए जाने वाले डिस्क स्थान को सीधे tmp (उपनिर्देशिका नहीं) के अंतर्गत
चाहता था

मुझे क्षमा करें, मैं शेल स्क्रिप्टिंग के चरण में नहीं हूं कि मैं इसे अभी तक समझ सकता हूं, इसलिए मैंने अन्य उपयोगकर्ताओं को यह तय करने दिया कि यह कितना अच्छा जवाब है। तुम्हारे काम के लिए धन्यवाद। बेहतर होने पर मैं इसका अध्ययन करूंगा।
xralf

0
find /tmp -exec du {} + | sort -nr | less 

सबसे बड़ी फ़ाइलों को सबसे पहले दिखाता है, ताकि आप qजितनी जल्दी देख सकें, उतने ही समय का उपयोग कर सकें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.