मानव पठनीय फ़ाइल आकारों को क्रमबद्ध करना


16

मैं मानव-पठनीय फ़ाइल-आकार प्रकार, संख्यात्मक प्रकार का उपयोग करके एक सूची कैसे सॉर्ट कर सकता हूं जो आकार पहचानकर्ता (जी, एम, के) को ध्यान में रखता है? क्या मैं du -shउदाहरण के लिए " " आउटपुट को सॉर्ट कर सकता हूं ?

समस्या: फ़ाइलों / फ़ोल्डरों को सूचीबद्ध करने और उनके आकार के आधार पर छाँटने की समस्या पर विचार करें। आप इसे चलाकर हासिल कर सकते हैं:

du -s * | sort -n

यह फाइलों / फ़ोल्डरों को उनके आकार के आधार पर क्रमबद्ध करता है। हालाँकि मुद्रित आकार का मूल्य बाइट्स (या मेगाबाइट्स, या गीगाबाइट्स में है यदि आप चुनते हैं)।

मानव-पठनीय मूल्यों के आधार पर छाँटने में सक्षम होना वांछनीय होगा, इसलिए मैं इसके अनुरूप कुछ चला सकता हूं

du -sh * | <human-readable file sort>

और 2.0M के बाद 1.5GB फ़ोल्डर दिखाता है।

जवाबों:



29

GNU कोरुटिल्स> = 7.5 का प्रयोग करें:

डु -हेश * | सॉर्ट -ह

(इस सर्वरफॉल्ट प्रश्न से लिया गया )

मैन पेज

संपादित करें: आप अपने संस्करणों का उपयोग करके जांच कर सकते हैं du --versionऔर sort --versionयदि आप GNU संस्करणों का उपयोग कर रहे हैं। आप homebrew उपयोग कर रहे हैं आप उपयोग करना पड़ सकता gduहै और gsort


8
OSX में यह विकल्प नहीं है। आप होमब्रे का उपयोग कर सकते हैं brew install coreutils(जो 'जी' के साथ सभी कोर्यूटिल कमांड को प्रीपेन्ड करता है)। आप तब कर सकते हैं gdu -hs * | gsort -h
dsummersl

1
बस @ dsummersl के बिंदु को स्पष्ट करने के लिए: du -hs *मैक ओएस एक्स पर ठीक काम करता है, लेकिन sort -hरिटर्न sort: invalid option -- h। एक भी MacPorts के माध्यम से coreutils पैकेज स्थापित कर सकते हैं जैसा कि यहाँ वर्णित है
jvriesem

3

यदि आप केवल 1MB से बड़ी फ़ाइलों के बारे में चिंतित हैं, जैसा कि ऐसा लगता है कि आप हैं, तो आप इस आदेश का उपयोग करके उन्हें सॉर्ट कर सकते हैं और आकार को MB में बदलने के लिए awk का उपयोग कर सकते हैं:

du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'

फिर, यह आकार को निकटतम MB तक ले जाता है। आप इसे अपनी पसंद की इकाई में परिवर्तित कर सकते हैं।


इस के समान है: du -sm * | sort -n-s/ मेगाबाइट / गीगाबाइट में आउटपुट आकार -gबनाता है du
notnoop

MB के लिए आपको 1024 से अधिक विभाजित करना होगा। तो यह होगाint($1 / (1024 * 1024))
प्रतिक खडलो

2

यह एक व्हाट्सएप या एपोस्ट्रोफ के साथ फाइलनाम को संभालता है, और उन प्रणालियों पर काम करता है जो समर्थन नहीं करते हैं : xargs -dयाsort -h

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

जिसके परिणामस्वरूप:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm

1

यहाँ एक और है:

$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'

आपको करना पड़ सकता है

$ cpan Number::Bytes::Human

प्रथम।


1

डु -स्क * | सॉर्ट-एन | awk '{प्रिंट $ 2}' | च पढ़ने के दौरान; डू -श "$ फ"; किया हुआ


1

यह आदेश MB में आकार के आधार पर छाँटेगा

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

यह पहले से ही है कि उपयोगकर्ता वास्तव में क्या कर रहा है, उसने अभी-अभी MiB के साथ उदाहरण नहीं दिया है लेकिन इसके बारे में उल्लेख किया है। वह जिस चीज की तलाश कर रहा है, वह -hफ्लैग टू डु का उपयोग करते समय छांटने में सक्षम है ।
टोनिन

0

जब से मैं एमबी और जीबी को एक ही आउटपुट में सम्मिलित करने का प्रयास कर रहा था, तब से मैं यहाँ समाप्त हो गया और मैं इसे नियंत्रित नहीं कर सका।

$NFइसका उपयोग तब से किया जाता है जब #GBया #MBपैटर्न आउटपुट में अंतिम कॉलम था:

somecommand | \
gawk '{
  if ($NF ~ /[0-9\.]+GB/) 
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF} 
}' | \
sort -n

जाग आज्ञा की व्याख्या:

if ($NF ~ /[0-9\.]+GB/)

यदि अंतिम कॉलम रेगेक्स पैटर्न से मेल खाता है जिसमें एक अंक या .एक या अधिक बार होता हैGB

{ a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \

फिर aप्रत्येक पंक्ति के अंकों के हिस्से में चर सेट करें जो समान रेगेक्स पैटर्न के समान अंतिम कॉलम ( $NF) में मेल खाता है

printf "%sMB\n", a*1024} \

सेटिंग के बाद a, printfआउटपुट को फॉर्मेट करने के लिए उपयोग करें${a*1024}MB

else {print $NF}

अन्यथा केवल अंतिम कॉलम प्रिंट करें

sort -n

आउटपुट पर संख्यात्मक प्रकार का उपयोग करें


उदाहरण

echo "4MB\n5GB\n420MB\n420GB\n1024MB\n1GB" | \                                                                                                                                 23:43:06 (EMP-2653/package-upgrades) Ø M
gawk '{
  if ($NF ~ /[0-9\.]+GB/)
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF}
}' | \
sort -n

मुझे यकीन है कि regex पैटर्न का पुन: उपयोग करने का एक तरीका है, इसलिए मैं केवल एक बार मैच कर रहा हूं और जगह ले रहा हूं, लेकिन मुझे नहीं पता कि अभी तक कैसे करना है :)

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