আমি কীভাবে ব্যাশ স্ক্রিপ্টে কোনও ফাইলের আকার পেতে পারি?
আমি এটি কীভাবে ব্যাশ ভেরিয়েবলের কাছে নির্ধারণ করব যাতে আমি এটি পরে ব্যবহার করতে পারি?
pvএবং এর catজন্য যুক্ত করুন
আমি কীভাবে ব্যাশ স্ক্রিপ্টে কোনও ফাইলের আকার পেতে পারি?
আমি এটি কীভাবে ব্যাশ ভেরিয়েবলের কাছে নির্ধারণ করব যাতে আমি এটি পরে ব্যবহার করতে পারি?
pvএবং এর catজন্য যুক্ত করুন
উত্তর:
আপনার সেরা বাজি যদি কোনও জিএনইউ সিস্টেমে থাকে:
stat --printf="%s" file.any
ম্যান স্ট্যাট থেকে :
% s মোট আকার, বাইটে
বাশ স্ক্রিপ্টে:
#!/bin/bash
FILENAME=/home/heiko/dummy/packages.txt
FILESIZE=$(stat -c%s "$FILENAME")
echo "Size of $FILENAME = $FILESIZE bytes."
দ্রষ্টব্য: ম্যাক ওএস এক্স-এ টার্মিনালটিতে স্ট্যাট কীভাবে ব্যবহার করতে হয় তার জন্য @ ক্লাবউনের উত্তর দেখুন ।
statআপনি লিনাক্স বা সাইগউইন ব্যবহার করছেন (ধরে নিলে এটি statমানক নয়) ধরে নেওয়া, @ হান্টেড 85 সবচেয়ে সোজা উপায় straight wc -cযেমন ইউজিন দ্বারা প্রস্তাবিত পোর্টেবল।
stat: illegal option -- c
stat --printf="%s" file.txt
stat -f%z myfile.tar
man statবলে যে - প্রিন্টফ পেছনের নতুন লাইনটি বাদ দেয়। আউটপুট দেখতে --formatবা ব্যবহার -cকরতে। আরো অন্তর্দৃষ্টি অর্জন করে তুলনা করে stat --printf="%s" file.any | xxd -করতেstat -c "%s" file.any | xxd -
file_size_kb=`du -k "$filename" | cut -f1`
ব্যবহারে সমস্যা statহ'ল এটি একটি জিএনইউ (লিনাক্স) এক্সটেনশন। du -kএবং cut -f1পসিক্স দ্বারা নির্দিষ্ট করা হয় এবং তাই কোনও ইউনিক্স সিস্টেমে পোর্টেবল।
সোলারিস, উদাহরণস্বরূপ, ব্যাশ সহ জাহাজগুলি কিন্তু সাথে নয় stat। সুতরাং এটি সম্পূর্ণ অনুমানমূলক নয়।
lsআউটপুটটির সঠিক ফর্ম্যাটটি নির্দিষ্ট না করাতে একইরকম সমস্যা রয়েছে, সুতরাং এর আউটপুট পার্সিং করা বহনযোগ্যভাবে করা যায় না। du -hএটি একটি জিএনইউ এক্সটেনশনও।
যেখানে সম্ভব বহনযোগ্য নির্মাণগুলিতে লেগে থাকুন এবং আপনি ভবিষ্যতে কারও জীবন সহজ করে তুলবেন। আপনার নিজের হতে পারে।
duফাইলটির আকার দেয় না, এটি ফাইলটি কতটা স্থান ব্যবহার করে তা সূচিত করে যা সূক্ষ্মভাবে পৃথক (সাধারণত রিপোর্ট করা duআকারটি ফাইলের আকারকে নিকটতম ব্লকের সাথে সংযুক্ত করে যেখানে ব্লক হয় সাধারণত 512 বি বা 1 কেবি বা 4 কেবি)।
--bytesবা -bপরিবর্তে এটির -kগ্রহণযোগ্য উত্তর হওয়া উচিত।
-h( "মানুষের") বিকল্পdu : সাধারণ মামলা সবচেয়ে উত্তরের উত্পাদন করা হবে file_size=`du -h "$filename" | cut -f1যেমন কেলভিন (কিলোবাইট), এম (মেগাবাইট) অথবা জি (গিগাবাইট) যথাযথ হিসাবে প্রদর্শন করা হবে।
-hএকটি জিএনইউ এক্সটেনশন; এটি স্ট্যান্ডার্ড
আপনি "শব্দ গণনা" কমান্ড ( wc) ব্যবহার করতে পারেন :
wc -c "$filename" | awk '{print $1}'
সমস্যাটি wcহ'ল এটি ফাইলের নাম যুক্ত করবে এবং আউটপুট ইনডেন্ট করবে। উদাহরণ স্বরূপ:
$ wc -c somefile.txt
1160 somefile.txt
আপনি যদি কেবল কোনও ফাইলের আকার গণনা করার জন্য কোনও পূর্ণ ব্যাখ্যামূলক ভাষা বা স্ট্রিম এডিটর বন্ধ করে এড়াতে চান, কেবল ফাইল থেকে ইনপুটটি পুনর্নির্দেশ করুন যাতে wcফাইলের নামটি কখনই না দেখে:
wc -c < "$filename"
নীচের গিলস দ্বারা উল্লিখিত শেল ভেরিয়েবল হিসাবে আপনি যে মানটি চেয়েছিলেন তা সহজেই হস্ত করতে এই শেষ ফর্মটি কমান্ড বিকল্পের সাথে ব্যবহার করা যেতে পারে ।
size="$(wc -c <"$filename")"
wc -c <"$FILENAME"এইভাবে অন্য কোনও ক্রাফট না দিয়ে আকার দেয় size=$(wc -c <"$FILENAME")।
wc -c < fileখুব দ্রুত বলে মনে হচ্ছে, কমপক্ষে ওএস এক্সে। আমি অনুমান করছি যে ডাব্লিউসি-র কেবলমাত্র-সি নির্দিষ্ট করা থাকলে ফাইলটি স্ট্যাট করার চেষ্টা করার জন্য মস্তিষ্ক রয়েছে।
wc -cব্যবহার করে fstat, তবে তারপরে ফাইলটির দ্বিতীয়-শেষ ব্লকটি অনুসন্ধান করে এবং সর্বশেষ আপ-টু st_blksizeবাইটগুলি পড়ে। দৃশ্যত এই কারণ লিনাক্স এর ফাইল /procএবং /sysউদাহরণস্বরূপ পরিসংখ্যান মাপ যে শুধুমাত্র আনুমানিক আছে , এবং wcপ্রকৃত মাপের না পরিসংখ্যান রিপোর্ট আকার প্রতিবেদন করতে চায়। আমি অনুমান করি যে এর wc -cচেয়ে আলাদা আকারের প্রতিবেদন করা অদ্ভুত হবে wc, তবে এটি যদি কোনও সাধারণ ডিস্ক ফাইল হয় তবে এটি ফাইল থেকে ডেটা পড়ার ধারণা নেই এবং এটি স্মৃতিতে নেই। বা আরও খারাপ, কাছের লাইনের টেপ স্টোরেজ ...
printfদেখে মনে হচ্ছে এটি এখনও উদ্বোধন দেখে, যেমন printf "Size: $size"-> size: <4 spaces> 54339। অন্যদিকে echoসাদা স্থান উপেক্ষা করে। এটিকে সামঞ্জস্য করার কোনও উপায়?
fstat। দৌড়াতে চেষ্টা করুন strace wc -c </etc/passwdএবং আপনি এটি দেখতে যাচ্ছেন তা দেখতে পাবেন।
বিএসডি'র (ম্যাক ওএস এক্স এর) statএকটি আলাদা ফর্ম্যাট আর্গুমেন্ট পতাকা এবং আলাদা ক্ষেত্রের স্পেসিফায়ার রয়েছে। থেকে man stat(1):
-f format: নির্দিষ্ট ফর্ম্যাটটি ব্যবহার করে তথ্য প্রদর্শন করুন। বৈধ ফর্ম্যাটগুলির বিবরণের জন্য ফর্ম্যাটস বিভাগটি দেখুন।z: বাইটগুলিতে ফাইলের আকার।এখন সব একসাথে:
stat -f%z myfile1.txt
আকার দ্বারা আপনি কী বোঝাতে চান তা নির্ভর করে ।
size=$(wc -c < "$file")
ফাইল থেকে পড়তে পারা যায় এমন সংখ্যাগুলি আপনাকে দিবে। IOW, এটি ফাইলের সামগ্রীর আকার। এটি তবে ফাইলের বিষয়বস্তুগুলি পড়বে (কেবলমাত্র ফাইলটি নিয়মিত ফাইল হয় বা wcএকটি অপ্টিমাইজেশন হিসাবে বেশিরভাগ বাস্তবায়নের ক্ষেত্রে নিয়মিত ফাইলের সাথে সিমলিংক থাকে)। এর পার্শ্ব প্রতিক্রিয়া হতে পারে। উদাহরণস্বরূপ, নামযুক্ত পাইপের জন্য, যা পড়া হয়েছে তা আর পড়তে পারবেন না এবং যেমন /dev/zeroবা /dev/randomঅসীম আকারের জিনিসগুলির জন্য এটি কিছুটা সময় নিতে চলেছে। এর অর্থ হ'ল readফাইলটিতে আপনার অনুমতি দরকার এবং ফাইলটির শেষ অ্যাক্সেস টাইমস্ট্যাম্প আপডেট করা যেতে পারে।
এটি স্ট্যান্ডার্ড এবং পোর্টেবল, তবে নোট করুন যে কিছু wcবাস্তবায়নের ক্ষেত্রে সেই আউটপুটে শীর্ষস্থানীয় ফাঁকা অংশ থাকতে পারে। এগুলি থেকে মুক্তি পাওয়ার একটি উপায় হ'ল ব্যবহার করা:
size=$(($(wc -c < "$file")))
অথবা একটি খালি গাণিতিক এক্সপ্রেশন এমন কোনো ত্রুটির সম্মুখীন এড়াতে dashবা yashযখন wcকোন আউটপুট (যেমন যখন ফাইল খোলা যাবে না) সৃষ্টি করে:
size=$(($(wc -c < "$file") +0))
ksh93হয়েছে wcbuiltin (প্রদত্ত আপনি এটি সক্রিয়, এছাড়াও আপনি এটি হিসাবে ডাকা যাবে command /opt/ast/bin/wc) যা এটা সবচেয়ে যে শেল নিয়মিত ফাইলের জন্য কার্যকরী করে তোলে।
বিভিন্ন ব্যবস্থা কমান্ড নামের statএকটি ইন্টারফেস যে stat()বা lstat()সিস্টেম কল।
সেই রিপোর্টের তথ্য ইনোডে পাওয়া গেছে। সেই তথ্যের একটি st_sizeবৈশিষ্ট্য attrib নিয়মিত ফাইলগুলির জন্য এটি সামগ্রীর আকার (ত্রুটির অভাবে এটি থেকে কতটা ডেটা পড়তে পারা যায় (বেশিরভাগ wc -cবাস্তবায়ন তাদের অপ্টিমাইজেশনে এটি ব্যবহার করে))। সিমলিংকের জন্য, এটি লক্ষ্য পথের বাইটগুলির আকার। নামযুক্ত পাইপের জন্য, সিস্টেমের উপর নির্ভর করে, এটি হয় 0 বা পাইপ বাফারে বর্তমানে বাইটের সংখ্যা। সিস্টেমের উপর নির্ভর করে ব্লক ডিভাইসগুলির জন্য একই, আপনি অন্তর্নিহিত স্টোরেজের বাইটে 0 বা আকার পান।
এই তথ্যটি পেতে আপনার ফাইলে পড়ার অনুমতি দরকার নেই, কেবল এটির সাথে যুক্ত ডিরেক্টরিটিই অনুসন্ধানের অনুমতি অনুসন্ধান করুন।
কালানুক্রমিক ক্রম অনুসারে, রয়েছে:
আইআরআইএক্সstat (90 এর):
stat -qLs -- "$file"
( ) বা: এর st_sizeগুণাবলী প্রদান করে$filelstat()
stat -s -- "$file"
সিমলিংক রেজোলিউশনের পরে যখন $fileকোনও সিমলিংক থাকে তখন এটি একই রকম st_size।
zsh statমডিউলটিতে বিল্টিন (বর্তমানে এটিও পরিচিত zstat) zsh/stat(লোডযুক্ত zmodload zsh/stat) (1997):
stat -L +size -- $file # st_size of file
stat +size -- $file # after symlink resolution
বা একটি ভেরিয়েবল সঞ্চয় করতে:
stat -L -A size +size -- $file
স্পষ্টতই, এটি সেই শেলটির মধ্যে সবচেয়ে দক্ষ।
জিএনইউstat (2001); stat২০০৫ সাল থেকে ব্যসিবক্সেও (জিএনইউ থেকে অনুলিপি করা stat):
stat -c %s -- "$file" # st_size of file
stat -Lc %s -- "$file" # after symlink resolution
(নোট -Lআইআরআইএক্স এর তুলনায় বিপরীত হয় বা zsh stat।
বিএসডিstat (2002):
stat -f %z -- "$file" # st_size of file
stat -Lf %z -- "$file" # after symlink resolutionঅথবা আপনি কিছু স্ক্রিপ্টিং ভাষার stat()/ lstat()ফাংশন যেমন ব্যবহার করতে পারেন perl:
perl -le 'print((lstat shift)[7])' -- "$file"
এআইএক্স-এর একটি istatকমান্ডও রয়েছে যা সমস্ত stat()( lstat()যেহেতু সিমলিঙ্কগুলিতে কাজ করবে না) তথ্য ছড়িয়ে দেবে এবং যা দিয়ে আপনি পোস্ট-প্রক্রিয়া করতে পারেন, উদাহরণস্বরূপ:
LC_ALL=C istat "$file" | awk 'NR == 4 {print $5}'
(জন্য ধন্যবাদ @JeffSchaller সাহায্যের আউট বিবরণ figuring )।
ইন tcsh:
@ size = -Z $file:q
(সিমিলিংক রেজোলিউশনের পরে আকার)
জিএনইউ তার statকমান্ড প্রবর্তনের অনেক আগে , জিএনইউ findকমান্ডের সাহায্যে তার -printfপ্রাকটিকের মাধ্যমে এটি অর্জন করা সম্ভব (ইতিমধ্যে 1991 সালে):
find -- "$file" -prune -printf '%s\n' # st_size of file
find -L -- "$file" -prune -printf '%s\n' # after symlink resolution
তবে একটি সমস্যা হ'ল এটি যদি কাজ করে না তবে $fileশুরু হয় -বা findপ্রিডিকেট (যেমন !, (...)।
পেতে মান কমান্ড stat()/ lstat()তথ্য ls।
প্যাসিকলি, আপনি এটি করতে পারেন:
LC_ALL=C ls -dn -- "$file" | awk '{print $5; exit}'
এবং -Lএকই জন্য sylink রেজোলিউশন যোগ করুন। এটি ডিভাইস ফাইলগুলির জন্য কাজ করে না যেখানে 5 ম ক্ষেত্রটি আকারের পরিবর্তে ডিভাইসটির প্রধান সংখ্যা।
ব্লক ডিভাইসগুলির জন্য, যেসব সিস্টেমে stat()0 এর জন্য 0 ফিরে আসে st_size, তাদের ব্লক ডিভাইসের আকারের প্রতিবেদন করার জন্য অন্যান্য এপিআই থাকে। উদাহরণস্বরূপ, লিনাক্সের রয়েছে BLKGETSIZE64 ioctl()এবং বেশিরভাগ লিনাক্স ডিস্ট্রিবিউশন এখন একটি blockdevকমান্ড নিয়ে শিপিয়েছে যা এটি ব্যবহার করতে পারে:
blockdev --getsize64 -- "$device_file"
তবে এর জন্য আপনাকে ডিভাইস ফাইলে পড়ার অনুমতি দরকার। সাধারণত অন্য উপায়ে আকার অর্জন করা সম্ভব। উদাহরণস্বরূপ (এখনও লিনাক্সে):
lsblk -bdno size -- "$device_file"
খালি ডিভাইস বাদে কাজ করা উচিত।
এমন পদ্ধতির যা সমস্ত সন্ধানযোগ্য ফাইলের জন্য কাজ করে (যাতে নিয়মিত ফাইল, বেশিরভাগ ব্লক ডিভাইস এবং কয়েকটি অক্ষর ডিভাইস অন্তর্ভুক্ত থাকে) ফাইলটি খোলার এবং শেষের দিকে চেষ্টা করা হয়:
সঙ্গে zsh(লোড হচ্ছে পরে zsh/systemমডিউল):
{sysseek -w end 0 && size=$((systell(0)))} < $fileসাথে ksh93:
< "$file" <#((size=EOF))
অথবা
{ size=$(<#((EOF))); } < "$file"সাথে perl:
perl -le 'seek STDIN, 0, 2 or die "seek: $!"; print tell STDIN' < "$file"নামে পাইপ জন্য, আমরা দেখা করেছি যে কিছু ব্যবস্থা (Aix, সোলারিস, এইচপি / ইউএক্স অন্তত) পরিমাণ ডেটা পাইপ পাওয়া বাফারে করা stat()'র st_size। কিছু (যেমন লিনাক্স বা ফ্রিবিএসডি) তা দেয় না।
লিনাক্সে কমপক্ষে, আপনি FIONREAD ioctl()পাইপটি খোলার পরে এটি ব্যবহার করতে পারেন (এটি ঝুলতে এড়াতে রিড + রাইট মোডে):
fuser -s -- "$fifo_file" &&
perl -le 'require "sys/ioctl.ph";
ioctl(STDIN, &FIONREAD, $n) or die$!;
print unpack "L", $n' <> "$fifo_file"
তবে নোট করুন যেহেতু এটি পাইপের সামগ্রীটি পড়ে না , কেবলমাত্র এখানে নামমাত্র পাইপটি খোলার ফলে এখনও পার্শ্ব প্রতিক্রিয়া হতে পারে। আমরা fuserপ্রথমে যাচাই করতে ব্যবহার করছি যে কিছু প্রক্রিয়া ইতিমধ্যে পাইপ খোলা আছে এটি হ্রাস করতে কিন্তু এটি নির্বোধ নয় যেহেতু fuserসমস্ত প্রক্রিয়া চেক করতে সক্ষম হতে পারে না।
এখন, আমরা কেবলমাত্র ফাইলগুলির সাথে সম্পর্কিত প্রাথমিক ডেটার আকার বিবেচনা করছি । এটি মেটাডেটার আকার এবং সেই ফাইলটি সংরক্ষণ করার জন্য প্রয়োজনীয় সমস্ত সহায়ক অবকাঠামো বিবেচনায় নেয় না।
আরেকটি inode অ্যাট্রিবিউট দ্বারা ফিরে stat()হয় st_blocks। এটি 512 বাইট ব্লকের সংখ্যা যা ফাইলের ডেটা সংরক্ষণ করতে ব্যবহৃত হয় (এবং কখনও কখনও এর কিছু মেটাডাটা লিনাক্সের এক্সট 4 ফাইল সিস্টেমে বর্ধিত বৈশিষ্ট্যের মতো)। এটি নিজেই ইনোড বা ফাইলের সাথে সংযুক্ত ডিরেক্টরিগুলির মধ্যে অন্তর্ভুক্ত নয় in
আকার এবং ডিস্কের ব্যবহার অগত্যা সংক্ষেপ, সংক্ষেপ, (কিছু সময় কিছু মেটাডেটা) হিসাবে যুক্ত নয়, কিছু ফাইল সিস্টেমে পরোক্ষ ব্লকের মতো অতিরিক্ত পরিকাঠামোর প্রভাব পরে থাকে।
এটি সাধারণত duডিস্ক ব্যবহারের রিপোর্ট করতে ব্যবহার করে। উপরের তালিকাভুক্ত বেশিরভাগ কমান্ড আপনাকে সেই তথ্য পেতে সক্ষম করবে।
POSIXLY_CORRECT=1 ls -sd -- "$file" | awk '{print $1; exit}'POSIXLY_CORRECT=1 du -s -- "$file" (ডিরেক্টরিগুলির মধ্যে নয় যেখানে এতে ফাইলগুলির ডিস্ক ব্যবহার অন্তর্ভুক্ত থাকবে)।find -- "$file" -printf '%b\n'zstat -L +block -- $filestat -c %b -- "$file"stat -f %b -- "$file"perl -le 'print((lstat shift)[12])' -- "$file"wc -cব্যবহার করে fstat, তবে তারপরে শেষ পর্যন্ত st_blksizeবাইটগুলি পড়ে। দৃশ্যত এই কারণ লিনাক্স এর ফাইল /procএবং /sysউদাহরণস্বরূপ পরিসংখ্যান মাপ যে শুধুমাত্র আনুমানিক আছে । এটি নির্ভুলতার জন্য ভাল তবে ফাইলটির শেষ যদি ডিস্কে থাকে এবং মেমরিতে থাকে না (উদাহরণস্বরূপ, লুপে অনেকগুলি ফাইল ব্যবহৃত হয়)। ফাইলটি কাছাকাছি-লাইন টেপ স্টোরেজে স্থানান্তরিত করা হয় , বা উদাহরণস্বরূপ FUSE স্বচ্ছ-ডিকম্প্রেশন ফাইল সিস্টেমে খুব খারাপ ।
ls -go file | awk '{print $3}'
-goবিএসডি ( alচ্ছিক (এক্সএসআই )) এ কাজ করবে না। আপনার এটিও প্রয়োজন ls -god file | awk '{print $3; exit}'( -dডিরেক্টরিতে এটি কাজ করার exitজন্য, টার্গেটে নতুন লাইনের সাথে সিমলিংকের জন্য)। ডিভাইস ফাইলগুলির সাথে সমস্যাগুলিও রয়ে গেছে।
wc -cযা বাইটের সংখ্যার প্রতিবেদন করে।
এই স্ক্রিপ্টটি ফাইলের আকার গণনা করার জন্য বিভিন্ন উপায়ে একত্রিত করে:
(
du --apparent-size --block-size=1 "$file" 2>/dev/null ||
gdu --apparent-size --block-size=1 "$file" 2>/dev/null ||
find "$file" -printf "%s" 2>/dev/null ||
gfind "$file" -printf "%s" 2>/dev/null ||
stat --printf="%s" "$file" 2>/dev/null ||
stat -f%z "$file" 2>/dev/null ||
wc -c <"$file" 2>/dev/null
) | awk '{print $1}'
স্ক্রিপ্টটি লিনাক্স, বিএসডি, ওএসএক্স, সোলারিস, সানোস ইত্যাদি সহ অনেকগুলি ইউনিক্স সিস্টেমে কাজ করে
ফাইলের আকার বাইটের সংখ্যা দেখায়। এটি আপাত আকার, যা ফাইলটি একটি বিশেষ ডিস্কে বিশেষ সংকোচন, বা বিশেষ বিচ্ছিন্ন অঞ্চলগুলি, বা অবিকৃত অবরুদ্ধ ব্লকস ইত্যাদি ব্যবহার করে বাইটস is
এই স্ক্রিপ্টটির আরও সহায়তা এবং আরও বিকল্প সহ এখানে একটি উত্পাদন সংস্করণ রয়েছে: https://github.com/SixArm/file-size
স্ট্যাটে সবচেয়ে কম সিস্টেম কল দিয়ে এটি করা দেখা যাচ্ছে:
$ set debian-live-8.2.0-amd64-xfce-desktop.iso
$ strace stat --format %s $1 | wc
282 2795 27364
$ strace wc --bytes $1 | wc
307 3063 29091
$ strace du --bytes $1 | wc
437 4376 41955
$ strace find $1 -printf %s | wc
604 6061 64793
ls -l filename ফাইলের আকার, অনুমতি এবং মালিক সহ কোনও ফাইল সম্পর্কে আপনাকে প্রচুর তথ্য দেবে।
পঞ্চম কলামে ফাইলের আকার এবং বাইটে প্রদর্শিত হয়। নীচের উদাহরণে ফাইলসাইজটি কেবল 2KB এর নীচে রয়েছে:
-rw-r--r-- 1 user owner 1985 2011-07-12 16:48 index.php
সম্পাদনা করুন: এটি সম্ভবত statকমান্ডের মতো নির্ভরযোগ্য নয় ।
ls -lএবং statকমান্ড উভয়ই নির্ভরযোগ্য আকারের তথ্য দেয়। আমি এর বিপরীতে কোনও রেফারেন্স পাইনি। ls -sব্লকের সংখ্যায় আকার দেবে।
du filename আপনাকে বাইটে ডিস্কের ব্যবহার বলবে।
আমি পছন্দ করি du -h filename, যা আপনাকে একটি মানব পাঠযোগ্য বিন্যাসে আকার দেয়।
du1024 বাইটের ব্লকগুলিতে আকারের মুদ্রণের এই স্বাদটি কোনও বাইটের সাধারণ গণনা নয়।
du512-বাইট ইউনিটের সংখ্যায় একটি আউটপুট দেয়। জিএনইউ তার পরিবেশে duডাকা না হলে পরিবর্তে কিবিবাইট ব্যবহার POSIXLY_CORRECTকরে।
আপনার শেল স্ক্রিপ্টগুলিতে ছোট ইউটিলিটি ফাংশন তৈরি করুন যা আপনি ডেলিগ্রে করতে পারেন।
উদাহরণ
#! /bin/sh -
# vim: set ft=sh
# size utility that works on GNU and BSD systems
size(){
case $(uname) in
(Darwin | *BSD*)
stat -Lf %z -- "$1";;
(*) stat -c %s -- "$1"
esac
}
for f do
printf '%s\n' "$f : $(gzip < "$f" | wc -c) bytes (versus $(size "$f") bytes)"
done
@ স্টাফেন চেজেলাসের উত্তর থেকে প্রাপ্ত তথ্যের ভিত্তিতে।
gzip -v < file > /dev/nullকোনও ফাইলের সংকোচনেতা পরীক্ষা করতে দেখুন ।
caseবিবৃতি ব্যবহার করতে চান । caseপ্যাটার্ন ম্যাচিংয়ের জন্য বোর্ন / পসিক্স কনস্ট্রাক্ট। [[...]]কেবলমাত্র ksh / bash / zsh (বৈচিত্র সহ)।
আমি একটি এডব্লিউকে 1 লাইনার পেয়েছি এবং এতে একটি বাগ রয়েছে তবে আমি এটি ঠিক করেছি। আমি টেরাবাইটসের পরে পেটাবাইটেও যুক্ত করেছি।
FILE_SIZE=234234 # FILESIZE IN BYTES
FILE_SIZE=$(echo "${FILE_SIZE}" | awk '{ split( "B KB MB GB TB PB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } printf "%.2f %s", $1, v[s] }')
স্ট্যাট বিবেচনা প্রতিটি একক সিস্টেমে নেই, আপনি প্রায় সর্বদা এডাব্লু কে সমাধান ব্যবহার করতে পারেন। উদাহরণ; রাস্পবেরী Pi নেই পরিসংখ্যান কিন্তু এটি আছে awk ।
অন্য একটি পসিক্স অনুগত উপায় হ'ল নতুন লাইন অক্ষরগুলি বাদ দিয়ে ইনপুট ফাইলের প্রতিটি লাইনের অক্ষরে দৈর্ঘ্য ফিরিয়ে আনার জন্য awkএটির length()ফাংশনটি ব্যবহার করা । তাই করে
awk '{ sum+=length } END { print sum+NR }' file
আমরা নিশ্চিত করেছি এতে NRযুক্ত হয়েছে sum, যার ফলে ফাইলের মধ্যে অক্ষরের মোট সংখ্যা এবং নিউলাইনগুলির মোট সংখ্যার ফলস্বরূপ। length()ফাংশন awkডিফল্ট উপায়ে একটি আর্গুমেন্ট যা লাগে length($0)যা বর্তমান পুরো লাইন জন্য।
printf 'a\nb' | awk '{ sum+=length } END { print sum+NR }'3 টি ছাপানো উচিত তবে 4 টি প্রিন্ট করা উচিত
আমি নিজে ডাব্লুসি বিকল্প পছন্দ করি। 'বিসি' দিয়ে যুক্ত, আপনি যত খুশি ঠিক তত জায়গায় দশমিক পেতে পারেন।
আমি একটি স্ক্রিপ্টের উন্নতি করতে চেয়েছিলাম যা আমার কাছে একটি 'ls -alh' কমান্ডের 'ফাইল আকার' কলামটি জাগিয়েছে। আমি কেবল পূর্ণসংখ্যার ফাইলের আকার চাইনি, এবং দুটি দশমিকের উপযুক্ত মনে হয়েছিল, তাই এই আলোচনাটি পড়ার পরে আমি নীচের কোডটি নিয়ে এসেছি।
আমি যদি সেটিকে কোনও স্ক্রিপ্টে অন্তর্ভুক্ত করি তবে আমি সেমিকোলনে লাইনটি ভাঙ্গার পরামর্শ দিচ্ছি।
file=$1; string=$(wc -c $file); bite=${string% *}; okay=$(echo "scale=2; $bite/1024" | bc);friend=$(echo -e "$file $okay" "kb"); echo -e "$friend"
"চিত্র ফাইলের দৈর্ঘ্য পান" এর জন্য আমার স্ক্রিপ্টটিকে জিপিএফএল বলা হয় । আমি একজন করছেন পরে এটি ব্যবহার mogrify ImageMagick একটি ফাইল, একটি গুই JPEG দর্শক এর মধ্যে একটি ছবি খোলার বা পুনরায় লোড আগে।
আমি জানি না যে এটি কীভাবে একটি "উত্তর" হিসাবে রেট দেয়, যেহেতু এটি ইতিমধ্যে দেওয়া এবং আলোচিত যা থেকে অনেক বেশি orrowণ নিয়ে থাকে। সুতরাং আমি এটি সেখানে রেখে দেব।
BZT
wcফাইলের শেষ ব্লকটি পড়তে পারে, যদি stat.st_sizeকেবলমাত্র একটি আনুমানিকতা ছিল (যেমন লিনাক্স /procএবং /sysফাইলগুলির জন্য)। আমি অনুমান করি যে তারা যখন যুক্তিটিকে কয়েক লাইনে যুক্ত করেছেন তখন তারা মূল মন্তব্যটি আরও জটিল না করার সিদ্ধান্ত নিয়েছেন: lingrok.org/xref/coreutils/src/wc.c#246
দ্রুততম এবং সহজতম (আইএমও) পদ্ধতিটি হ'ল:
bash_var=$(stat -c %s /path/to/filename)
duএবং wcউত্তরগুলির বিষয়ে অভিযোগ করতে পারি যেগুলির সত্যিকারের জীবনে এটি করার আগে কখনও অস্বীকার করা উচিত । আমি আজ রাতে আমার উত্তরটি একটি বাস্তব জীবনের প্রয়োগে ব্যবহার করেছি এবং ভেবেছিলাম এটি ভাগ করে নেওয়া সার্থক। আমি অনুমান করি যে আমাদের সকলের মতামত সঙ্কুচিত আছে ।