कैसे प्रत्येक फ़ाइल के आकार और निर्देशिका को सूचीबद्ध करें और बैश में उतरते हुए आकार को क्रमबद्ध करें?


108

मैंने पाया कि बाश में निर्देशिका का आकार प्राप्त करना आसान नहीं है?

मैं चाहता हूं कि जब मैं टाइप करता हूं ls -<some options>, तो यह एक ही समय में निर्देशिका के फ़ाइल आकार के सभी योगों की सूची पुनरावृत्ति कर सकता है और आकार क्रम से सॉर्ट कर सकता है।

क्या यह संभव है?


2
एक निर्देशिका के "आकार" से वास्तव में आपका क्या अभिप्राय है? इसके तहत फ़ाइलों की संख्या (पुनरावर्ती या नहीं)? इसके तहत फ़ाइलों के आकार का योग (पुनरावर्ती या नहीं)? निर्देशिका का डिस्क आकार ही? (एक निर्देशिका को एक विशेष फ़ाइल के रूप में लागू किया जाता है जिसमें फ़ाइल नाम और अन्य जानकारी होती है।)
कीथ थॉम्पसन

पुनरावृत्ति के तहत फाइलों के आकार का योग होना चाहिए
किट हो

1
@ किट: फिर duजवाब है।
कीथ थॉम्पसन

duयदि आप सटीक आकार प्राप्त करना चाहते हैं तो @KeithThompson @KitHo कमांड फ़ाइल स्पेस उपयोग का अनुमान लगाती है।
ztank1013

@ ztank1013: "सटीक आकार" से आपका क्या अर्थ है, इसके आधार पर du(कम से कम GNU कोरुटिल्स संस्करण) में संभवतः जानकारी प्रदान करने का विकल्प होता है।
कीथ थॉम्पसन

जवाबों:


218

बस निर्देशिका में नेविगेट करें और निम्नलिखित कमांड चलाएं:

du -a --max-depth=1 | sort -n

या मानव-पठनीय आकारों के लिए -h जोड़ें और पहले बड़ी निर्देशिकाओं / फ़ाइलों को प्रिंट करने के लिए -r।

du -a -h --max-depth=1 | sort -hr

23
du -hsort -hयह सुनिश्चित करने के लिए भी आवश्यक है कि 981Mपहले कह दें 1.3G; साथ sort -nही संख्या को ध्यान में रखा जाएगा और वे गलत रास्ते दौर होगा।
स्माइलर्स

यह वर्तमान निर्देशिका के भीतर अलग-अलग फ़ाइलों के आकार को सूचीबद्ध नहीं करता है, केवल इसके उपनिर्देशिकाओं का आकार और वर्तमान निर्देशिका का कुल आकार। आप आउटपुट में व्यक्तिगत फ़ाइलों को कैसे शामिल करेंगे (ओपी के सवाल का जवाब देने के लिए)?
एरिक ट्रॉटमैन

@ErikTrautman फ़ाइलों की सूची को भी आप जोड़ने की जरूरत है -aऔर उपयोग करने --allके बजाय --max-depth=1तो जैसेdu -a -h --all | sort -h
फ्रेंको

बहुत बढ़िया! मैं कुछ सालों से कुछ कर रहा हूं। :)
कॉल्बी ब्लेयर

6
sort -hकेवल GNU के संस्करण / लिनक्स पर काम करता है, BSD / OS X के साथ कोई भाग्य नहीं।
djule5

20

स्पष्ट रूप से --max-depthविकल्प मैक ओएस एक्स के duकमांड के संस्करण में नहीं है । आप इसके बजाय निम्नलिखित का उपयोग कर सकते हैं।

du -h -d 1 | sort -n


जाहिर है, लेकिन आश्चर्यजनक रूप से नहीं।
जोश हबदास 10

20
du -s -- * | sort -n

(यह छिपी हुई (.dotfiles) फ़ाइलों को नहीं दिखाएगी

du -smएमबी इकाइयों आदि के लिए उपयोग करें । मैं हमेशा उपयोग करता हूं

du -smc -- * | sort -n

क्योंकि कुल रेखा ( -c) स्पष्ट कारणों से तल पर समाप्त हो जाएगी :)

पुनश्च:

  • डॉटफ़ाइल्स से निपटने के लिए टिप्पणियां देखें
  • मैं अक्सर 'du -smc / home / / | सॉर्ट एन-टेल 'का अहसास पाने के लिए कि वास्तव में बड़े बिट्स कहां बैठे हैं

5
du --max-depth=1|sort -nया find . -mindepth 1 -maxdepth 1|xargs du -s|sort -nडॉटफ़ाइल्स को भी शामिल करने के लिए।
अरनौद ले ब्लैंक

@ स्वर्ण: मैं वह भी उपयोग करता हूं, लेकिन यह इस प्रश्न (/ उत्तर) के लिए सही जोड़ नहीं लगता है :)
sehe

@ arnaud576875 find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -nअगर कुछ पाए गए रास्तों में स्थान हो सकता है।
8

1
यह मानव का सबसे बड़ा पठनीय दृश्य प्राप्त करने का एक शानदार संस्करण है:sudo du -smch * | sort -h | tail
मार्सबर्ड

16

आदेश

du -h --max-depth=0 * | sort -hr

उत्पादन

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

व्याख्या

  • du "डिस्क उपयोग" प्रदर्शित करता है
  • h "मानव पठनीय" के लिए है (दोनों, क्रमबद्ध और डु में)
  • max-depth=0साधन duसबफ़ोल्डर्स के आकार को नहीं दिखाएगा (हटाएं यदि आप प्रत्येक फ़ाइल के सभी आकारों को हर उप-, सब -ub, ..., फ़ोल्डर में दिखाना चाहते हैं)
  • r "रिवर्स" के लिए है (सबसे बड़ी फ़ाइल पहले)

ncdu

जब मैं इस सवाल पर आया, तो मैं अपनी फाइल सिस्टम को साफ करना चाहता था। कमांड लाइन टूल ncduइस कार्य के लिए बेहतर अनुकूल है।

उबंटू पर स्थापना:

$ sudo apt-get install ncdu

उपयोग:

बस ncdu [path]कमांड लाइन में टाइप करें । पथ के विश्लेषण के लिए कुछ सेकंड के बाद, आप कुछ इस तरह देखेंगे:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

वर्तमान में हाइलाइट किए गए तत्व को हटाएं d, CTRL+ के साथ बाहर निकलेंc


तुम भी दोहे लिख सकते थे * | सॉर्ट -हर। -s (संक्षेप) के रूप में ही है
मोम

5

ls -Sआकार के अनुसार। फिर, आकार भी दिखाने के लिए, आकार के आधार पर ls -lSएक लंबा ( -l), क्रमबद्ध ( -S) प्रदर्शित करता है। मैं आमतौर पर -hबहुत कुछ जोड़ता हूं , ताकि चीजें आसानी से पढ़ सकें, इसलिए ls -lhS


1
आह, क्षमा करें, यह आपके पोस्ट से स्पष्ट नहीं था। आप चाहते हैं du, लगता है कि किसी ने इसे पोस्ट किया है। @sehe: आपकी वास्तविक परिभाषा पर निर्भर करता है - यह वह स्थान दिखा रहा है जो निर्देशिका स्वयं को संग्रहीत करने के लिए उपयोग कर रही है। (यह सिर्फ उपजातियों के आकार में नहीं जोड़ रहा है।) यह एक यादृच्छिक संख्या नहीं है, और यह हमेशा 4KiB नहीं है।
थानाटोस


0

मुझे लगता है कि मुझे पता चल गया होगा कि आप क्या करना चाहते हैं। यह सभी फ़ाइलों और सभी निर्देशिकाओं की क्रमबद्ध सूची देगा, जो निर्देशिकाओं में फ़ाइल आकार और सामग्री के आकार के अनुसार क्रमबद्ध होगी।

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n

कोई बात नहीं, सेह ने बहुत सरल समाधान प्रस्तुत किया है। मुझे हर दिन कुछ नया सीखना अच्छा लगता है!
दवोरक

मुझे नहीं लगता कि इसका उपयोग duकरना एक विकल्प है, यह आपको केवल एक अनुमानित परिणाम देगा।
ztank1013

0

[बढ़ाया संस्करण]
यह नीचे दिए गए प्रारंभिक संस्करण की तुलना में बहुत तेज़ और सटीक होने वाला है और वर्तमान फ़ाइल के सभी फ़ाइल आकार के योग को आउटपुट करेगा:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

stat -c %sएक फ़ाइल पर आदेश बाइट में इसका आकार वापस आ जाएगी। यहां trकमांड का उपयोग xargsकमांड सीमाओं को दूर करने के लिए किया जाता है (जाहिरा तौर पर पाइपिंग xargsअधिक लाइनों पर परिणामों को विभाजित कर रहा है, मेरी कमांड के तर्क को तोड़ता है)। इसलिए (प्लस) साइन के trसाथ लाइन फीड को बदलने का ख्याल रखा जा रहा है +sedअंतिम लक्ष्य (मूल कैलकुलेटर) कमांड +से शिकायत से बचने के लिए परिणामी स्ट्रिंग से अंतिम चिन्ह को हटाने का एकमात्र लक्ष्य bcहै, जो हमेशा की तरह गणित करता है।

प्रदर्शन: मैंने इसे कई निर्देशिकाओं में और ~ 150.000 से अधिक फ़ाइलों का परीक्षण किया है (मेरे फेडोरा 15 बॉक्स की फ़ाइलों की वर्तमान संख्या) होने से मुझे विश्वास है कि यह एक अद्भुत परिणाम है:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

यदि आप du -sb /कमांड के साथ तुलना करना चाहते हैं , तो यह बाइट्स ( -bविकल्प) में अनुमानित डिस्क उपयोग का उत्पादन करेगा।

# du -sb /
12684646920 /

जैसा कि मैं उम्मीद कर रहा था कि यह मेरी कमांड गणना से थोड़ा बड़ा है क्योंकि duउपयोगिता रिटर्न प्रत्येक फ़ाइल का स्थान आवंटित करती है और वास्तविक खपत स्थान नहीं।

[आरंभिक संस्करण] यदि आप अपने फ़ोल्डर का सटीक योग आकार जानना चाहते हैं, तो आप कमांड का
उपयोग नहीं कर सकते duक्योंकि (मान पृष्ठ उद्धरण के duअनुसार ) अंतरिक्ष उपयोग का अनुमान लगाता है। इसलिए यह आपको एक गलत परिणाम की ओर ले जाएगा, एक सन्निकटन (शायद योग के आकार के करीब लेकिन वास्तविक आकार जो आप देख रहे हैं, उससे अधिक होने की संभावना है)।

मुझे लगता है कि आपके प्रश्न का उत्तर देने के अलग-अलग तरीके हो सकते हैं लेकिन यह मेरा है:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

इसके अंतर्गत सभी फाइलें मिलती हैं। निर्देशिका (परिवर्तन जो भी निर्देशिका आपको पसंद है) के साथ, छिपी हुई फ़ाइलें भी शामिल हैं और (उपयोग करके xargs) एक ही पंक्ति में उनके नाम का आउटपुट करती है, फिर एक विस्तृत सूची का उपयोग करके उत्पादन करती है ls -l। यह (कभी-कभी) विशाल आउटपुट कट कमांड की ओर पाइप किया जाता है और केवल पांचवें क्षेत्र ( -f5), जो बाइट्स में फ़ाइल का आकार लिया जाता है और फिर से पाइप किया जाता है, xargsजिसके खिलाफ फिर से आकार की एक पंक्ति को रिक्त द्वारा अलग किया जाता है। अब एक मैजिक मैजिक लें जो प्रत्येक रिक्त स्थान को प्लस ( +) चिन्ह के साथ बदलता है और अंत में bc(मूल कैलकुलेटर) गणित करता है।

इसे अतिरिक्त ट्यूनिंग की आवश्यकता हो सकती है और आपके पास lsतर्क सूची के बारे में बहुत लंबे समय तक शिकायत हो सकती है।


यदि डायरेटरी बहुत बड़ी है, तो यह लंबे समय तक लटका रहता है, अपने होम डायरेक्टरी पर काम करने की कोशिश करें: पी
किट हो

@ ठीक है, मुझे डर है कि हर एक फ़ाइल को खोजे बिना और उसका आकार जोड़े बिना एक सटीक परिणाम प्राप्त करने का कोई आसान और तेज़ तरीका नहीं है, इसलिए कमांड आलस्य मुख्य रूप से इस बात पर निर्भर करता है कि खोज की गई निर्देशिका के नीचे कितनी फाइलें हैं ... लेकिन मेरा मानना ​​है कि सुधार के लिए मार्जिन है ... अच्छी चुनौती!
ztank1013

@ किथो वहाँ, मेरे उत्तर में उन्नत संस्करण पर एक नज़र डालें ... और मुझे निश्चित रूप से बताएं!
ztank1013

0

एक और सरल उपाय।

$ for entry in $(ls); do du -s "$entry"; done | sort -n

परिणाम जैसा दिखेगा

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

"du -s" को "du -sh" में बदलने से मानव का पठनीय आकार दिखाई देगा, लेकिन हम इस पद्धति को क्रमबद्ध नहीं कर पाएंगे।


0

आप निम्न का उपयोग करके फाइलों की सूची बना सकते हैं du -h | सॉर्ट -हर | more or du -h --max-गहराई = 0 * | सॉर्ट -हर | अधिक


0

मैं एक सरल तरीके से डु का उपयोग करता हूं।

du -sh */ | sort -n

यह मुझे एक विचार प्रदान करता है कि कौन सी निर्देशिका सबसे अधिक स्थान का उपभोग कर रही है। मैं बाद में और अधिक सटीक खोज चला सकता हूं।


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