سؤال كيف يمكنني فرز الإخراج -h من الحجم


أحتاج للحصول على قائمة بمخرجات du القابلة للقراءة من البشر.

ومع ذلك، du لا يحتوي على خيار "فرز حسب الحجم" ، و piping إلى sort لا يعمل مع العلم البشري المقروء.

على سبيل المثال ، تشغيل:

du | sort -n -r 

يخرج استخدام قرص تم فرزه حسب الحجم (تنازلي):

du |sort -n -r
65108   .
61508   ./dir3
2056    ./dir4
1032    ./dir1
508     ./dir2

ومع ذلك ، فإن تشغيلها باستخدام علامة مقروءة بشرية ، لا يتم فرزها بشكل صحيح:

du -h | sort -n -r

508K    ./dir2
64M     .
61M     ./dir3
2.1M    ./dir4
1.1M    ./dir1

لا أحد يعرف طريقة الفرز du -h  حسب الحجم؟


834
2018-02-25 13:42


الأصل


هيه ... مضحكة يجب أن تسأل ، لأن هذا كان مزعج لي ... أكثر من عام على الأقل. في الأسبوع الماضي ، قمت بتنزيل الكود إلى نواة غنو (التي هي جزء منها) ، وقد نظرت ، لكن قررت أن الأمر سيستغرق بعض الوقت أكثر مما كنت أحمله على يدي ... أي شخص؟ :) - unwind
إليك سؤال كثير الصلة: serverfault.com/q/737537/35034 - cregox
هل شاهدت هذا؟ unix.stackexchange.com/questions/4681/...  إنها نسخة مكررة تقريبًا وتستحق الذهب. أنت تفعل طبيعية du ولكن إضافة -h إلى sort أمر. يمكنك ان تضيف -rh بحيث يكون أكبرها أولاً في الملف ، وإلا تحتاج tail لرؤية الخنازير الفضائية. - SDsolar
لم أكن أتوقع أن يكون مثل هذا السؤال شائعًا جدًا عندما أجريت بحثًا عن هذا. - Mateen Ulhaq


الأجوبة:


اعتبارا من GNU coreutils 7.5 صدر في أغسطس 2009 ، sort يسمح ل -h المعلمة ، والتي تسمح لاحقات رقمية من النوع التي تنتجها du -h:

du -hs * | sort -h

إذا كنت تستخدم نوعًا لا يدعمه -h، يمكنك تثبيت غنو Coreutils. مثلا على نظام التشغيل Mac OS X الأقدم:

brew install coreutils
du -hs * | gsort -h

من عند sort كتيب:

-h, --human-numeric-sort compare human readable numbers (e.g., 2K 1G)


1158
2017-07-01 12:29



القسم ذات الصلة من الدليل: gnu.org/software/coreutils/manual/... - wodow
سهلة التركيب على OS X مع البيرة - تركيب نواة الأساسية. - Richard Poirier
هذا جيد! أنا شخصيا فعلت دائما du -BM | sort -nr كحل بديل - يكون الإنسان قابلاً للقراءة بما فيه الكفاية ، ويتم فرزه ، إذا كان أي شخص عالقًا مع النواة الأساسية القديمة. - chutz
إذا كنت تستخدم OSX عبر Homebrew ، فستحتاج الآن إلى استخدام gsort بدلاً من الفرز: du -hs * | gsort -h - Brian Cline
PaulDraper، du -BM يطبع كل شيء بالميغابايت ، لذلك فإن الملف 168K سيعرض فعليًا كـ 0M. ما لم يكن هناك بعض التناقض في نسخة أخرى لست على علم. نسختى من du يعرض فقط قيم ميجابايت صحيحة. - chutz


du | sort -nr | cut -f2- | xargs du -hs

82
2018-02-25 13:52



وسوف تفعل كمية كبيرة من العد المتكرر. - Douglas Leeder
في البداية ، تقوم بـ du العادية - ثم تعيد حساب الحجم فقط لطباعته في شكل مقروء لكل شخص. - Douglas Leeder
@ دوجلاس ليدر: أنت على حق في العد المكرر ، ولكن أعتقد أن دو الثاني لا يبدأ من ذاكرة التخزين المؤقت الباردة (بفضل نظام التشغيل)hasen j: xargs أمر مفيد للغاية ، فإنه يقسم stdin ويغذيها كحجج إلى الأمر المعطى - cadrian
كريس في الواقع متفوقة لأنه يعمل مع المسارات التي تحتوي على مسافة بيضاء. رمي التصويت طريقك ، يا صديقي. - rbright
القبيح ، ولكن عبر منصة :). - voretaq7


@ دوجلاس ليدر ، إجابة أخرى: فرز المخرجات القابلة للقراءة من du -h باستخدام أداة أخرى. مثل بيرل!

du -h | perl -e 'sub h{%h=(K=>10,M=>20,G=>30);($n,$u)=shift=~/([0-9.]+)(\D)/;
return $n*2**$h{$u}}print sort{h($b)<=>h($a)}<>;'

انقسام على سطرين لتناسب العرض. يمكنك استخدامه بهذه الطريقة أو جعله خطًا واحدًا ، سيعمل في كلتا الحالتين.

انتاج:

4.5M    .
3.7M    ./colors
372K    ./plugin
128K    ./autoload
100K    ./doc
100K    ./syntax

تصحيح: بعد بضع جولات من الجولف في PerlMonks، والنتيجة النهائية هي ما يلي:

perl -e'%h=map{/.\s/;99**(ord$&&7)-$`,$_}`du -h`;die@h{sort%h}'

59
2018-02-25 21:04



نواتج الإصدار القصير الخاصة بك stderr بسبب die يمكنك تغييرها لجعلها الإخراج stdout؟ - Dennis Williamson
غير ال die ل print وسوف تذهب الى stdout. إنها مجرد شخصيتين إضافيتين. - Adam Bellaire
يعمل على أوبونتو! - marinara
الإعجاب بيرل hackistry - nandoP
والنتيجة بترتيب عكسي :( - RSFalcon7


هناك أداة مفيدة للغاية أستخدمها تسمى ncdu التي تم تصميمها للبحث عن تلك المجلدات والملفات pesky الاستخدام عالية القرص وإزالتها. إنها تعتمد على وحدة التحكم ، وسريعة وخفيفة ، ولديها حزم على جميع التوزيعات الرئيسية.


50
2018-02-25 20:39



لطيفة جدا ... أنا عجيبة إذا كان يمكن تغذية النتائج إلى معيار ... أنا كسول جدا لدرجة أنني لا أستطيع قراءة الدليل - ojblass
GT5 في نفس السياق ميزة القاتل هو عرض النمو. - Tobu
هذا رائع حقا! وأسرع بكثير من التسكع du، إذا كنت تريد فقط تحديد الدلائل الكبيرة. - BurninLeo


du -k * | sort -nr | cut -f2 | xargs -d '\n' du -sh

43
2018-02-25 14:01



فقط ما كنت أبحث عنه شكرا - Edward Tanguay
لا يمكن استخدامها مع du -k --total، يعطي خطأ في النهاية du: cannot access 'total': No such file or directory - laggingreflex
أنا أحب هذا واحد أكثر أي إجابة أخرى. كيف تذهب لتظهر فقط أول 50 نتيجة؟ - Mauro
Mauro - فقط الأنابيب النتيجة ل head عن طريق إضافة `| الرأس -50` في النهاية. - Samuel Lelièvre


بقدر ما أستطيع أن أرى أن لديك ثلاثة خيارات:

  1. تغير du لفرز قبل العرض.
  2. تغير sort لدعم الأحجام البشرية للفرز العددي.
  3. بعد عملية الإخراج من نوع لتغيير الإخراج الأساسي إلى الإنسان للقراءة.

يمكنك أيضا القيام به du -k والعيش بأحجام في KiB.

بالنسبة للخيار 3 ، يمكنك استخدام النص التالي:

#!/usr/bin/env python

import sys
import re

sizeRe = re.compile(r"^(\d+)(.*)$")

for line in sys.stdin.readlines():
    mo = sizeRe.match(line)
    if mo:
        size = int(mo.group(1))
        if size < 1024:
            size = str(size)+"K"
        elif size < 1024 ** 2:
            size = str(size/1024)+"M"
        else:
            size = str(size/(1024 ** 2))+"G"

        print "%s%s"%(size,mo.group(2))
    else:
        print line

20
2018-02-25 13:53





لقد واجهت هذه المشكلة أيضًا وأنا أستخدم حاليًا حلًا:

du -scBM | sort -n

لن ينتج عن ذلك قيم مقاسة ، ولكن ينتج دائمًا الحجم بالميغابايت. هذا أقل مثالية ، لكن بالنسبة لي أفضل من لا شيء (أو عرض الحجم بالبايت).


19
2018-02-25 13:56



أنا أحب ال -BM التبديل ، والذي هو في الأساس نفسه كما -m ، ولكن لديه ميزة عرض الحجم و M postfixed إلى ذلك ، حتى تحصل على 10M وهو أكثر وضوحا بكثير من 10 فقط :) - Tom Feiner
هذا هو أبسط حل رأيته حتى الآن في هذه الصفحة ، شكرًا لك! - Jeff Olson


وجدت هذا النشر في مكان آخر. ولذلك ، فإن هذا البرنامج النصي قذيفة تفعل ما تريد دون الدعوة du على كل شيء مرتين. يستخدم awk لتحويل وحدات البايت الخام إلى تنسيق قابل للقراءة. بالطبع ، يختلف التنسيق قليلاً (تتم طباعة كل شيء إلى دقة منزلة عشرية واحدة).

#/bin/bash
du -B1 | sort -nr  |awk '{sum=$1;
hum[1024**3]="G";hum[1024**2]="M";hum[1024]="K";
for (x=1024**3; x>=1024; x/=1024){
        if (sum>=x) { printf "%.1f%s\t\t",sum/x,hum[x];print $2;break
}}}'

تشغيل هذا في بلدي .vim غلة الدليل:

4.4M            .
3.6M            ./colors
372.0K          ./plugin
128.0K          ./autoload
100.0K          ./syntax
100.0K          ./doc

(آمل أن 3.6M من أنظمة الألوان ليست مفرطة.)


18
2018-02-25 14:09



لدي جواب بيرل أيضا ، لكن أعتقد أنه قد يجعل الناس يكرهونني: du -B1 | نوع -nr | perl -e '٪ h = (0 => b، 1 => K، 2 => M، 3 => G)؛ لـ (<>) {($ s، @ f) = split / \ s + /؛ $ e = 3 ؛ $ e-- بينما (1024 ** $ e> $ s) ؛ $ v = ($ s / (1024 ** $ e))؛ printf "٪ -8s٪ s \ n"، sprintf ($ v> = 100؟ "٪ d٪ s": "٪ .1f٪ s"، $ s / (1024 ** $ e)، $ h {$ e})، @ f؛} ' - Adam Bellaire
على الرغم من أن إجابة بيرل تعطي تنسيقها أقرب إلى دو بكثير. على الرغم من أن التقريب قد تم إيقاف ... يبدو أن دو يعطي دائما ceil () بدلا من round () - Adam Bellaire
مهلا ، لماذا أستخدم تجزئة هناك؟ يجب أن يكون صفيف ... صباح-الدماغ تذمر.... - Adam Bellaire
وأضاف أفضل حل بيرل كإجابة أخرى. - Adam Bellaire
كلا الإصدارين تفشل عندما تحتوي أسماء الملفات على مسافات - Vi.


يستخدم هذا الإصدار awk لإنشاء أعمدة إضافية لمفاتيح الفرز. انها تدعو فقط du ذات مرة. يجب أن يبدو الإخراج تمامًا du.

لقد قسمتها إلى عدة أسطر ، ولكن يمكن إعادة دمجها في سطر واحد.

du -h |
  awk '{printf "%s %08.2f\t%s\n", 
    index("KMG", substr($1, length($1))),
    substr($1, 0, length($1)-1), $0}' |
  sort -r | cut -f2,3

تفسير:

  • BEGIN - قم بإنشاء سلسلة للفهرسة لاستبدال 1 ، 2 ، 3 لـ K ، M ، G لتجميع الوحدات ، إذا لم تكن هناك وحدة (الحجم أقل من 1K) ، فليس هناك أي تطابق ويتم إرجاع صفر (مثالي! )
  • قم بطباعة الحقول الجديدة - وحدة ، قيمة (لجعل عمل alpha-sort مناسب بشكل غير صحيح ، ذو طول ثابت) والخط الأصلي
  • فهرسة آخر حرف في حقل الحجم
  • سحب الجزء الرقمي من الحجم
  • فرز النتائج وتجاهل الأعمدة الزائدة

جربها دون cut الأمر لمعرفة ما يفعله.

وإليك النسخة التي تقوم بالفرز داخل البرنامج النصي AWK ولا تحتاج cut:

du -h |
   awk '{idx = sprintf("%s %08.2f %s", 
         index("KMG", substr($1, length($1))),
         substr($1, 0, length($1)-1), $0);
         lines[idx] = $0}
    END {c = asorti(lines, sorted);
         for (i = c; i >= 1; i--)
           print lines[sorted[i]]}'

14
2017-09-04 17:06



شكرا جزيلا! هذا هو المثال الأول الذي يعمل بالنسبة لي في OS X 10.6 دون احتساب البرامج النصية perl / phython. وشكرا مرة أخرى على التفسير الجيد. دائما جميلة لتعلم شيئا جديدا. awk بالتأكيد هو أداة قوية. - Wolf
عظيم الشكر على ذلك. لقد غيرت دو إلى du -sh * لإظهار الملفات والدلائل الفورية دون أصل متكرر. - HankCa