मानव पठनीय आकार कैसे छाँटते हैं


11

मैं मूल रूप से फ़ाइलों की तलाश कर रहा हूँ फिर आकार के अनुसार छँटाई। स्क्रिप्ट काम करती है अगर मैं मानव द्वारा पठनीय आकार को सॉर्ट नहीं करता हूं। लेकिन मैं चाहता हूं कि आकार मानव पठनीय हो। मैं उन आकारों को कैसे छाँट सकता हूँ जो मानव पठनीय हैं?

उदाहरण के लिए:

 ls -l | sort -k 5 -n | awk '{print $9 " " $5}'

यह उम्मीद के मुताबिक काम करता है, मुझे अपनी फ़ाइलों का आकार बाइट्स आरोही में मिला है:

1.txt 1
test.txt 3
bash.sh* 573
DocGeneration.txt 1131
andres_stuff.txt 1465
Branches.xlsx 15087
foo 23735
bar 60566
2016_stuff.pdf 996850

अब, मैं चाहता हूं कि आकार मानव पठनीय हो, इसलिए मैंने l में एक -h पैरामीटर जोड़ा, और अब कुछ फाइलें क्रम से बाहर हैं:

 ls -lh | sort -k 5 -n | awk '{print $9 " " $5}'
1.txt 1
DocGeneration.txt 1.2K
andres_stuff.txt 1.5K
test.txt 3
Branches.xlsx 15K
foo 24K
bar 60K
bash.sh* 573
2016_stuff.pdf 974K


-k 5- वह कैसे काम करता है?
ctrl-alt-delor-

@ ctrl-alt-delor: मेरा मानना ​​है कि आकार lsआउटपुट के 5 वें कॉलम में है
jesse_b

2
duइसके बजाय का उपयोग करना lsएक अच्छा विचार हो सकता है।
ज़ेनॉइड

... या findकी -printfअपने साथ %pऔर %sformatters (एक आकार के "humanisation" के बाद)।
स्टीफन किट

@Jesse_b मेरी त्रुटि है, मैंने अभी यह मान लिया है कि प्रश्न में डेटा (जैसा कि मुझे यह मिला है) हल किया गया इनपुट था। मैं गलत था।
सीटीएल-अल्ट-डेलोर

जवाबों:


28

प्रयत्न sort -h k2

-h, -मानव-संख्यात्मक-प्रकार मानव पठनीय संख्याओं की तुलना करते हैं (उदाहरण के लिए, 2K 1G)

यह ग्नू सॉर्ट, बीएसडी सॉर्ट और अन्य का हिस्सा है।


5
lsसे बचने के उत्पादन पार्स नहीं करना चाहिए?

3
@ टॉमाज़ हमेशा नहीं। यदि यह आपको आवश्यक आउटपुट प्रदान करता है, तो इसे किसी अन्य स्वरूपण ऑपरेशन में पाइप करना विशेष रूप से खतरनाक नहीं है। आपको जो नहीं करना चाहिए , उसके आउटपुट पर लूप है ls, और इसके बजाय सीधे फ़ाइल ग्लोबिंग का उपयोग करें। अकेले ग्लोबिंग यहां काम नहीं करेगा। उस ने कहा, मैं शायद इसके लिए पसंद करूंगा du
ब्लडगैन

1
@ फ्लडगैन ls फॉर्मेट सिस्टम / ls बायनेरिज़ के समान होने की गारंटी नहीं है, इसलिए इसे पार्स करना असंभव माना जाता है।
डी। बेन नोबल


1
@ बाढ़: files=(); for f in *; do [[ -L "$f" ]] && files+=("$f"); done; echo ${#files[@]}(मेरे पास एक सहिष्णु परीक्षण स्विच गलत हो सकता है)। यदि आप सीमलिंक के बारे में परवाह नहीं करते हैं files=(*); echo ${#files[@]}, जो कि यदि आप उपयोग करते हैं setऔर सरणियाँ नहीं तो पोर्टेबल हो जाती हैं।
डी। बेन नोबल

29

lsइस कार्यक्षमता में बनाया गया है, -Sरिवर्स ऑर्डर में विकल्प और सॉर्ट का उपयोग करें :ls -lShr

       -r, --reverse
              reverse order while sorting

       -S     sort by file size, largest first

1
-hएक मानक lsविकल्प नहीं है , लेकिन यदि ओपी के पास पहले से ही है तो यह प्रयोग करने योग्य होना चाहिए। बाकी मानक हैं, और यह निश्चित रूप से उत्तर है जो मैंने लिखा होगा।
टोबी स्पाइट

5
+1 के आउटपुट को पार्स करने में गड़बड़ न करें ls
डेविड रिचरबी

यह सबसे अच्छा उत्तर है, लेकिन इसमें @ टोबी की टिप्पणी में जानकारी शामिल होनी चाहिए: -Sआपके लिए उपलब्ध नहीं हो सकती है ls। FWIW, -SEmacs की लाइब्रेरी के साथ भी समर्थित है ls-lisp.el, जिसका उपयोग तब किया जाता है जब OS के पास कोई नहीं होता है ls। यह उदाहरण के लिए, एमएस विंडोज पर Emacs में काम करता है।
ड्रयू

यह स्वीकृत उत्तर होना चाहिए।
तितर बितर

1
@ ड्रू: टोबी की टिप्पणी कहती है कि -hसार्वभौमिक रूप से उपलब्ध नहीं हो सकती है, लेकिन ओपी पहले से ही इसका उपयोग कर रहा है। -Sवास्तव में सार्वभौमिक रूप से उपलब्ध होना चाहिए , क्योंकि यह पॉस्की लिंक में है जो टोबी प्रदान करता है। हालाँकि, काफी कुछ गैर POSIX टूलकिट वहाँ मौजूद हैं।
केविन

5

चूँकि किसी विशिष्ट शेल का उल्लेख नहीं किया गया था, यहाँ zshशेल में पूरी चीज़ को कैसे करना है :

ls -lhf **/*(.Lk-1024oL)

**जैसे ग्लोब नमूने का मिलान *लेकिन भर में /तरह pathnames में, यानी एक पुनरावर्ती खोज करना होगा।

lsकमांड के साथ मानव पठनीय आकार के लिए सक्षम होगा -h, और साथ लंबी सूची उत्पादन प्रारूप -l-fविकल्प को अक्षम छँटाई, इसलिए lsकेवल क्रम में वे दिया जाता है में फ़ाइलों की सूची होगी।

इस आदेश को **/*(.Lk-1024oL)फ़ाइल नाम ग्लोबिंग पैटर्न द्वारा व्यवस्थित किया गया है ताकि छोटी फ़ाइलों को पहले सूचीबद्ध किया जाए। **/*बिट इस निर्देशिका और नीचे में हर फाइल और निर्देशिका से मेल खाता है, लेकिन (...)संशोधित ग्लोब के व्यवहार (यह एक "ग्लोब क्वालीफायर" है)।

यह oLअंत में है कि oफ़ाइल आकार ( L, "लंबाई") के नामों का आदेश देता है ।

.शुरू में ग्लोब केवल नियमित रूप से फ़ाइलें (कोई निर्देशिका) से मेल करता है।

Lk-1024बिट चयन फ़ाइलें जिसका आकार है कम से कम 1024 KB ( "1024 की तुलना में कम KB में लंबाई")।

यदि zshआपका प्राथमिक इंटरैक्टिव शेल नहीं है, तो आप उपयोग कर सकते हैं

zsh -c 'ls -lf **/*(.Lk-1024oL)'

उपयोग setopt GLOB_DOTS(या zsh -o GLOB_DOTS -c ...) छिपे हुए नामों से मेल खाने के लिए भी। ... या सिर्फ Dग्लोब क्वालीफायर स्ट्रिंग में जोड़ें ।


उपर्युक्त पर विस्तार करते हुए, यह मानते हुए कि आप पथ-नाम और मानव पठनीय आकारों के साथ 2-कॉलम आउटपुट चाहते हैं, और यह भी मानते हैं कि आपके पास numfmtGNU कोरुटिल्स हैं,

zmodload -F zsh/stat b:zstat

for pathname in **/*(.Lk-1024oL); do
    printf '%s\t%s\n' "$pathname" "$(zstat +size "$pathname" | numfmt --to=iec)"
done

या, जल्दी,

paste <( printf '%s\n' **/*(.Lk-1024oL) ) \
      <( zstat -N +size **/*(.Lk-1024oL) | numfmt --to=iec )

4

यदि आपके sortपास -hविकल्प नहीं है तो आप निम्नलिखित की तरह एक (बहुत लंबे समय तक) awk कमांड का उपयोग कर सकते हैं:

find . -type f -size -1024k -exec ls -al {} \; | sort -k 5 -n | awk '{if ($5 > 1099511627776) {print $9,$5/1024/1024/1024/1024"T"} else if ($5 > 1073741824) {print $9,$5/1024/1024/1024"G"} else if ($5 > 1048576) {print $9,$5/1024/1024"M"} else if ($5 > 1024) {print $9,$5/1024"K"} else {print $9,$5"B"}}' | column -t

यह आपके आउटपुट को बाइट्स में क्रमबद्ध करेगा और फिर बाद में उन्हें उनके मानव पठनीय आकार में बदल देगा।


-1

क्या यह काम करेगा?

ls -l | awk '{if ($5<=1024) {print}}' | sort -k 5 -n | awk '{print $9"\t"substr($5/1024,1,3)"k"} '| column -t

पहली awkऍम 1 एम से कम की फ़ाइलों की खोज करेगा और दूसरा परिणाम से बाइट का आकार लेगा और इसे केबी में परिवर्तित करेगा और पहले 3 तत्वों को मानव-पठनीय आकार देने के लिए प्रिंट करेगा।


यह वास्तव में OPs प्रश्न को हल नहीं करता है - यह केवल वर्तमान निर्देशिका में दिखता है और केवल नियमित फ़ाइलों को प्रिंट करेगा। साथ ही 1MB के बजाय 1Kb से तुलना करेगा। अंत में हम कोड के काम करने के बारे में कुछ स्पष्टीकरण के जवाब के बाद हैं।
21

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