क्या सूचीबद्ध फ़ाइलों के आकार को योग करने का एक तरीका है?


20

यह वह कमांड है जिसका उपयोग मैं कुछ फाइलों को सूचीबद्ध करने के लिए कर रहा हूं:

find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \;
-rw-r--r--   1 qa1wrk15   test       1265190 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_7.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1345554 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_2.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1370532 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_3.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1399854 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_8.20110929.extract.sys

और इसी तरह।

अब मैं इन फाइलों के कुल आकार की गणना 5 वें कॉलम के हिसाब से करना चाहता हूं। मैंने ऐसा करने का सोचा awk, ऐसा करने के लिए मैंने एक विशेष निर्देशिका में निम्नलिखित का परीक्षण किया

>ls -lrt | awk `{ print $1 }`
ksh: syntax error at line 1 : `{' unmatched

मुझे समझ नहीं आ रहा है कि समस्या क्या है, यह वाक्य रचना त्रुटि क्यों है ।

मैं कोशिश करने के लिए सोच रहा हूं

ls -lrt | awk `BEGIN {total = 0} {for(i=0;i<NR;i++){total+=$5}} END {printf "%d",total} 

यह भी, लेकिन एक साधारण awkस्क्रिप्ट काम नहीं कर रही है।

यदि मैं गलत हूं, या इसके लिए कोई हल है, तो कृपया मुझे सुझाव दें या सही करें।

जवाबों:


26

सबसे पहले, आपको सीधे एकल उद्धरण ( ') का उपयोग करना चाहिए , न कि झुकाव वाले ( `)।

awkइनलाइन स्क्रिप्ट का पालन हो सकता है:

ls -lrt | awk '{ total += $5 }; END { print total }'

इसलिए, इनिशियलाइज़ करने की आवश्यकता नहीं है total( awkइसे शून्य पर आरंभीकृत करता है), और लूप की आवश्यकता नहीं है, awkपहले से ही इनपुट की प्रत्येक पंक्ति पर स्क्रिप्ट निष्पादित करता है।


1
संक्षेप में, वन-लाइनर यह होगा: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
हेल्ट


16

@enzotib ने पहले ही बताया है कि आपकी सिंटैक्स त्रुटि क्या है - मैं थोड़ा स्पर्शरेखा पर जा रहा हूं।

संख्याओं के एक कॉलम को समेटना उन चीज़ों में से एक है जो पॉप अप करता रहता है। मैंने इस शेल फ़ंक्शन को समाप्त कर दिया है:

sumcol() 
{ 
    awk "{sum+=\$$1} END {print sum}"
}

इसके साथ, आपका समाधान बन जाता है:

ls -lrt | sumcol 5

वह कॉलम 5 में संख्याओं को जोड़ देगा और मूल्य को प्रिंट करेगा।


वास्तव में, मैं सोच रहा था कि उसके लिए एक मानक उपयोगिता क्यों नहीं है।
enzotib

ठीक मेरी .aliasesफ़ाइल में जाता है ।
कोनराड रुडोल्फ

14

यहां इसका उपयोग करने का एक और तरीका है du:

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'

1
दू का उत्कृष्ट उपयोग। अच्छा उदाहरण है। अतिरिक्त लाभ के रूप में, आप गिग में आउटपुट प्राप्त करने के लिए डु में "-एच" विकल्प जोड़ सकते हैं। फिर आपको अंकों और इस तरह की गणना करने की आवश्यकता नहीं है। मैंने सिर्फ फाइलों के एक समूह पर एक परीक्षण चलाया, जो आकार में लगभग 1188800 kbytes हैं। कितना बड़ा है? कोई बात नहीं, du -ch --files0-from=-मुझे बताता है कि मेरा कुल "9.0G" है। Sweeeet!
माइक एस

मिठाई, डु का उत्कृष्ट उपयोग!
हरदिवस

इसके अलावा, यदि आप केवल कुल में रुचि रखते हैं, तो डु आउटपुट को पाइप करें tail -1
हरदिवस

4

यदि एचपी-यूएक्स के पास findभी -printfविकल्प है, तो bcगणना के लिए सूत्र तैयार करने के लिए उपयोगी होगा :

( find . -name \*.extract.sys -size +1000000c -printf '%s+'; echo 0 ) | bc

यदि सूत्र बहुत बड़ा हो जाता है, तो इसकी गणना चरण-दर-चरण की जा सकती है:

( find . -name \*.extract.sys -size +1000000c -printf 's+=%s\n'; echo s ) | bc

1

GNU के साथ find:

find -name '*.extract.sys' -size +1000000c -printf '%s\n' | jq -s add

GNU के साथ stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -c%s '{}' + | jq -s add

बीएसडी के साथ stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -f%z '{}' + | jq -s add

है jqएक उपयोगिता? डेबियन डिस्ट्रीब्यूशन (डेबियन 4.9.51-1 (2017-09-28) x86_64 GNU / Linux)
डेथ मेटल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.