তালিকাভুক্ত ফাইলের আকারের যোগফলের কোনও উপায় আছে কি?


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

প্রথমত, আপনার সোজা একক উদ্ধৃতি ( ') ব্যবহার করা উচিত , incোকানোগুলি ( `) নয়।

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

@ এনজোটিব ইতিমধ্যে আপনার সিনট্যাক্স ত্রুটিটি কী তা নির্দেশ করেছে - আমি একটু স্পর্শকাতর হয়ে যাব।

সংখ্যার কলামের সংমিশ্রণ হ'ল এমন জিনিসগুলির মধ্যে একটি যা পপিং আপ করে চলে। আমি এই শেল ফাংশনটি শেষ করেছি:

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

এটির সাথে আপনার সমাধানটি হয়ে যায়:

ls -lrt | sumcol 5

এটি কলাম 5 সংখ্যার যোগফল এবং মান মুদ্রণ করবে।


বাস্তবে, আমি ভাবছিলাম যে কেন এটির জন্য কোনও স্ট্যান্ডার্ড ইউটিলিটি নেই।
এনজোটিব

সরাসরি আমার .aliasesফাইলের মধ্যে যায় ।
কনরাড রুডলফ

14

এটি করার আরও একটি উপায় এখানে ব্যবহার করে du:

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

1
ডু এর দুর্দান্ত ব্যবহার। চমৎকার উদাহরণ। একটি অতিরিক্ত সুবিধা হিসাবে, আপনি গিগের মধ্যে আউটপুট পেতে ডুতে "-h" বিকল্পটি যুক্ত করতে পারেন। তারপরে আপনাকে অঙ্কগুলি এবং এ জাতীয় গণনা করতে হবে না। আমি কেবলমাত্র একগুচ্ছ ফাইলগুলির পরীক্ষা করেছি যা প্রায় 1188800 কেবিট আকারের। এটা কত বড়? কোনও ব্যাপার না, du -ch --files0-from=-আমাকে বলে যে আমার মোটটি "9.0G"। Sweeeet!
মাইক এস

মিষ্টি, দু'র দুর্দান্ত ব্যবহার!
হরিদসভ

এছাড়াও, যদি আপনি শুধুমাত্র মোট আগ্রহী, তারপর পাইপ আউটপুট du 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

জিএনইউ সহ find:

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

জিএনইউ সহ 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 জিএনইউ / লিনাক্স)
ডেথ মেটাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.