שאלה איך אני יכול למיין du-h פלט לפי גודל


אני צריך לקבל רשימה של פלט לקריאה אנושית לקריאה.

למרות זאת, du אין אפשרות "מיון לפי גודל", וצנרת 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




ללא שם: Heh ... ללא שם: מצחיק אתה צריך לשאול, שכן זה היה מטריד אותי ... ללא שם: מעל שנה לפחות. בשבוע שעבר הורדתי את הקוד ל- GNU coreutils (איזה מין הוא חלק ממנו), והיה לי מבט, אבל החלטתי שזה ייקח קצת יותר זמן ממה שהיה לי על הידיים כדי תיקון ... מישהו? :) - unwind
הנה שאלה קשורה מאוד: serverfault.com/q/737537/35034 - cregox
ראית את זה? unix.stackexchange.com/questions/4681/...  זהו שכפול כמעט שווה זהב. אתה עושה נורמלי du אבל להוסיף את -h sort פקודה. אתה יכול להוסיף -rh אז הגדולים הם הראשונים בקובץ, אחרת אתה צריך tail כדי לראות את חזירים בחלל. - SDsolar
לא ציפיתי ששאלה כזאת תהיה כל כך פופולרית כשאני אעשה זאת בגוגל. - Mateen Ulhaq


תשובות:


החל מ גנו שוחרר באוגוסט 2009, sort מאפשר a -h פרמטר, המאפשר סיומות מספריות מהסוג המיוצר על ידי du -hYou

du -hs * | sort -h

אם אתה משתמש במיון שאינו תומך -h, ניתן להתקין את ה- GNU 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 עם homebrew - לחלוט להתקין. - 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 - אז עבור כל ערך זה realculates את הגודל רק כדי להדפיס אותו בצורה קריא אדם. - Douglas Leeder
@ Douglas Leeder: אתם צודקים עבור הספירה הכפולה, אך חשבו שהדו השני אינו מתחיל מטמון קר (הודות למערכת ההפעלה) @ hasen j: xargs היא פקודה שימושית מאוד, היא מחלקת את הסטדין שלה ומזינה אותו כטיעונים אל הפקודה הנתונה - 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

עריכה: אחרי כמה סיבובים של גולף מעל פרלמונקס, התוצאה הסופית היא כדלקמן:

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
מרשים perl 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
@ מאורו - רק צינור התוצאה head על ידי הוספת `| 50,000 50,000` בקצה. - 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

זה לא ייצר ערכים scaled, אבל תמיד לייצר את הגודל של מגה בייט. זה פחות מושלם, אבל בשבילי זה יותר טוב מכלום (או להציג את גודל בתים).


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



יש לי גם תשובה של פרל, אבל אני חושב שזה עלול לגרום לאנשים לשנוא אותי: דו-בי מיון-ניר | (= =) b, 1 => K, 2 => M, 3 => G), עבור (<>) {($ s, @ f) = פיצול / \ + +; $ ($ ** $ $ $ $ $) $ $ = ($ s / (1024 ** $ e)); printf "% -8%% \ n", sprintf ($ v> = 100% "d% s": "% .1f% s", $ s / (1024 ** $ e), $ h {$ e}), @ f;} ' - Adam Bellaire
למרות שהתשובה של פרל למעשה מעניקה את העיצוב שלה הרבה יותר קרוב לדו. למרות העיגול הוא כבוי ... זה נראה כמו תמיד תמיד נותן ceil () ולא עגול () - Adam Bellaire
ללא שם: היי, מדוע השתמשתי hash שם? היה צריך להיות מערך ... בוקר-מוח רטן.... - Adam Bellaire
הוסיף פתרון פרל טוב יותר כתשובה נוספת. - Adam Bellaire
שתי הגרסאות נכשלות כאשר שמות קבצים מכילים רווחים - Vi.


גרסה זו משתמשת awk כדי ליצור עמודות נוספות עבור מקשי מיון. זה רק קורא du פעם אחת. הפלט צריך להיראות בדיוק כמו du.

אני כבר לפצל אותו למספר שורות, אבל זה יכול להיות recombined לתוך אחד אניה.

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), אז אין התאמה ואפס מוחזר (מושלם! )
  • להדפיס את השדות החדשים - יחידה, ערך (כדי להפוך את העבודה אלפא מיון כראוי זה אפס מרופד, באורך קבוע) ואת השורה המקורית
  • אינדקס התו האחרון של שדה הגודל
  • לשלוף את החלק המספרי של הגודל
  • למיין את התוצאות, למחוק את העמודות הנוספות

נסה את זה בלי cut הפקודה לראות מה היא עושה.

הנה גרסה אשר עושה את המיון בתוך סקריפט AWK ואינו צריך cutYou

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



תודה! זה הדוגמה הראשונה שעובדת בשבילי במערכת ההפעלה X 10.6 לא סופר את ה- perl / phython-scripts. ושוב תודה על ההסבר הטוב. תמיד נחמד ללמוד משהו חדש. awk בטוח הוא כלי רב עוצמה. - Wolf
תודה רבה על כך. שיניתי את הדו du -sh * להראות רק את הקבצים המיידיים וספריות ללא ירידה רקורסיבית. - HankCa


הנה דוגמה המציגה את הספריות בצורה קומפקטית יותר מסוכמת. הוא מטפל רווחים בספרייה / קבצים.

% du -s * | sort -rn | cut -f2- | xargs -d "\n" du -sh

53G  projects
21G  Desktop
7.2G VirtualBox VMs
3.7G db
3.3G SparkleShare
2.2G Dropbox
272M apps
47M  incoming
14M  bin
5.7M rpmbuild
68K  vimdir.tgz

13
2018-03-18 22:10



MacOS / משתמשי OSX להיות הזהיר כי הגירסה MAC של xargs אינו תומך דגל, ואם אתה משמיט את זה, כל ספריות המכילות שטח יש כל מילה מנותח בנפרד אשר כמובן נכשל. - jasonology


מיון קבצים לפי גודל ב- MB

du --block-size=MiB --max-depth=1 path | sort -n

9
2017-09-04 08:10