আমি কীভাবে ব্যাশ স্ক্রিপ্টে কোনও ফাইলের আকার পেতে পারি?


245

আমি কীভাবে ব্যাশ স্ক্রিপ্টে কোনও ফাইলের আকার পেতে পারি?

আমি এটি কীভাবে ব্যাশ ভেরিয়েবলের কাছে নির্ধারণ করব যাতে আমি এটি পরে ব্যবহার করতে পারি?



1
প্রগতি এবং ইটিএ দেখায় এমন একটি অনুলিপি কমান্ডের সাথে pvএবং এর catজন্য যুক্ত করুন
সুডো

স্ট্যাটাস -c% s ফাইল.নাম
কখনই নয়

উত্তর:


241

আপনার সেরা বাজি যদি কোনও জিএনইউ সিস্টেমে থাকে:

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."

দ্রষ্টব্য: ম্যাক ওএস এক্স-এ টার্মিনালটিতে স্ট্যাট কীভাবে ব্যবহার করতে হয় তার জন্য @ ক্লাবউনের উত্তর দেখুন ।


7
statআপনি লিনাক্স বা সাইগউইন ব্যবহার করছেন (ধরে নিলে এটি statমানক নয়) ধরে নেওয়া, @ হান্টেড 85 সবচেয়ে সোজা উপায় straight wc -cযেমন ইউজিন দ্বারা প্রস্তাবিত পোর্টেবল।
গিলস


stat --printf="%s" file.txt
দেবিয়ান

5
MacOS এ এটি কাজ করে:stat -f%z myfile.tar
সিসিপিজ্জা

2
@ উহু আপনার প্রম্পট আউটপুট ওভাররাইট করে। man statবলে যে - প্রিন্টফ পেছনের নতুন লাইনটি বাদ দেয়। আউটপুট দেখতে --formatবা ব্যবহার -cকরতে। আরো অন্তর্দৃষ্টি অর্জন করে তুলনা করে stat --printf="%s" file.any | xxd -করতেstat -c "%s" file.any | xxd -
নাতি

92
file_size_kb=`du -k "$filename" | cut -f1`

ব্যবহারে সমস্যা statহ'ল এটি একটি জিএনইউ (লিনাক্স) এক্সটেনশন। du -kএবং cut -f1পসিক্স দ্বারা নির্দিষ্ট করা হয় এবং তাই কোনও ইউনিক্স সিস্টেমে পোর্টেবল।

সোলারিস, উদাহরণস্বরূপ, ব্যাশ সহ জাহাজগুলি কিন্তু সাথে নয় stat। সুতরাং এটি সম্পূর্ণ অনুমানমূলক নয়।

lsআউটপুটটির সঠিক ফর্ম্যাটটি নির্দিষ্ট না করাতে একইরকম সমস্যা রয়েছে, সুতরাং এর আউটপুট পার্সিং করা বহনযোগ্যভাবে করা যায় না। du -hএটি একটি জিএনইউ এক্সটেনশনও।

যেখানে সম্ভব বহনযোগ্য নির্মাণগুলিতে লেগে থাকুন এবং আপনি ভবিষ্যতে কারও জীবন সহজ করে তুলবেন। আপনার নিজের হতে পারে।


48
duফাইলটির আকার দেয় না, এটি ফাইলটি কতটা স্থান ব্যবহার করে তা সূচিত করে যা সূক্ষ্মভাবে পৃথক (সাধারণত রিপোর্ট করা duআকারটি ফাইলের আকারকে নিকটতম ব্লকের সাথে সংযুক্ত করে যেখানে ব্লক হয় সাধারণত 512 বি বা 1 কেবি বা 4 কেবি)।
গিলস

7
@ গিলস, স্পার্স ফাইল (অর্থাত্ সেগুলির মধ্যে ছিদ্রযুক্ত) দৈর্ঘ্যের চেয়ে কম রিপোর্ট করে report
ভোনব্র্যান্ড

5
এটির সাথে --bytesবা -bপরিবর্তে এটির -kগ্রহণযোগ্য উত্তর হওয়া উচিত।
আমেদী ভ্যান গ্যাস

1
-h( "মানুষের") বিকল্পdu : সাধারণ মামলা সবচেয়ে উত্তরের উত্পাদন করা হবে file_size=`du -h "$filename" | cut -f1যেমন কেলভিন (কিলোবাইট), এম (মেগাবাইট) অথবা জি (গিগাবাইট) যথাযথ হিসাবে প্রদর্শন করা হবে।
ফ্রেলাউ

1
@ ফড়ালাউ: ওপি "এটিকে একটি ব্যাশ ভেরিয়েবলের জন্য বরাদ্দ করতে চায় যাতে তারা এটি পরে ব্যবহার করতে পারে", তাই এটি সম্ভবত পাঠযোগ্য অনুমান নয়, প্রকৃত সংখ্যাসূচক মান চাইবে। এছাড়াও, -hএকটি জিএনইউ এক্সটেনশন; এটি স্ট্যান্ডার্ড
নেমো

72

আপনি "শব্দ গণনা" কমান্ড ( wc) ব্যবহার করতে পারেন :

wc -c "$filename" | awk '{print $1}'

সমস্যাটি wcহ'ল এটি ফাইলের নাম যুক্ত করবে এবং আউটপুট ইনডেন্ট করবে। উদাহরণ স্বরূপ:

$ wc -c somefile.txt
    1160 somefile.txt

আপনি যদি কেবল কোনও ফাইলের আকার গণনা করার জন্য কোনও পূর্ণ ব্যাখ্যামূলক ভাষা বা স্ট্রিম এডিটর বন্ধ করে এড়াতে চান, কেবল ফাইল থেকে ইনপুটটি পুনর্নির্দেশ করুন যাতে wcফাইলের নামটি কখনই না দেখে:

wc -c < "$filename"

নীচের গিলস দ্বারা উল্লিখিত শেল ভেরিয়েবল হিসাবে আপনি যে মানটি চেয়েছিলেন তা সহজেই হস্ত করতে এই শেষ ফর্মটি কমান্ড বিকল্পের সাথে ব্যবহার করা যেতে পারে ।

size="$(wc -c <"$filename")"

30
wc -c <"$FILENAME"এইভাবে অন্য কোনও ক্রাফট না দিয়ে আকার দেয় size=$(wc -c <"$FILENAME")
গিলস

6
আরও একটি বিষয়: আমি এটি পরীক্ষা করেছি এবং wc -c < fileখুব দ্রুত বলে মনে হচ্ছে, কমপক্ষে ওএস এক্সে। আমি অনুমান করছি যে ডাব্লিউসি-র কেবলমাত্র-সি নির্দিষ্ট করা থাকলে ফাইলটি স্ট্যাট করার চেষ্টা করার জন্য মস্তিষ্ক রয়েছে।
এডওয়ার্ড ফালক

4
@ অ্যাডওয়ার্ডফাল্ক: জিএনইউ wc -cব্যবহার করে fstat, তবে তারপরে ফাইলটির দ্বিতীয়-শেষ ব্লকটি অনুসন্ধান করে এবং সর্বশেষ আপ-টু st_blksizeবাইটগুলি পড়ে। দৃশ্যত এই কারণ লিনাক্স এর ফাইল /procএবং /sysউদাহরণস্বরূপ পরিসংখ্যান মাপ যে শুধুমাত্র আনুমানিক আছে , এবং wcপ্রকৃত মাপের না পরিসংখ্যান রিপোর্ট আকার প্রতিবেদন করতে চায়। আমি অনুমান করি যে এর wc -cচেয়ে আলাদা আকারের প্রতিবেদন করা অদ্ভুত হবে wc, তবে এটি যদি কোনও সাধারণ ডিস্ক ফাইল হয় তবে এটি ফাইল থেকে ডেটা পড়ার ধারণা নেই এবং এটি স্মৃতিতে নেই। বা আরও খারাপ, কাছের লাইনের টেপ স্টোরেজ ...
পিটার

1
printfদেখে মনে হচ্ছে এটি এখনও উদ্বোধন দেখে, যেমন printf "Size: $size"-> size: <4 spaces> 54339। অন্যদিকে echoসাদা স্থান উপেক্ষা করে। এটিকে সামঞ্জস্য করার কোনও উপায়?
ইউজিন কুলাবোভভ

2
@keithpjolley: কল করে fstat। দৌড়াতে চেষ্টা করুন strace wc -c </etc/passwdএবং আপনি এটি দেখতে যাচ্ছেন তা দেখতে পাবেন।
নেমো

48

বিএসডি'র (ম্যাক ওএস এক্স এর) statএকটি আলাদা ফর্ম্যাট আর্গুমেন্ট পতাকা এবং আলাদা ক্ষেত্রের স্পেসিফায়ার রয়েছে। থেকে man stat(1):

  • -f format: নির্দিষ্ট ফর্ম্যাটটি ব্যবহার করে তথ্য প্রদর্শন করুন। বৈধ ফর্ম্যাটগুলির বিবরণের জন্য ফর্ম্যাটস বিভাগটি দেখুন।
  • ... ফর্ম্যাটস বিভাগ ...
  • z: বাইটগুলিতে ফাইলের আকার।

এখন সব একসাথে:

stat -f%z myfile1.txt

28

আকার দ্বারা আপনি কী বোঝাতে চান তা নির্ভর করে ।

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 -- $file
  • গনুহ stat -c %b -- "$file"
  • বাসদ stat -f %b -- "$file"
  • perl -le 'print((lstat shift)[12])' -- "$file"

স্পষ্টভাবে সর্বাধিক বিস্তৃত এবং তথ্যমূলক উত্তর। ধন্যবাদ. আমি BSD এবং GNU পরিসংখ্যান তথ্য ব্যবহার করে ক্রস প্ল্যাটফর্ম বাশ স্ক্রিপ্টগুলি তৈরি করতে এটি ব্যবহার করতে পারি
অলিগোফ্রেন

1
মজাদার ঘটনা: জিএনইউ কোর্টিলগুলি 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জন্য, টার্গেটে নতুন লাইনের সাথে সিমলিংকের জন্য)। ডিভাইস ফাইলগুলির সাথে সমস্যাগুলিও রয়ে গেছে।
স্টাফেন চেজেলাস

1
@ нιηসнιη ইউনিক্স এপিআই পাঠ্য এবং বাইনারি ফাইলগুলির মধ্যে কোনও পার্থক্য রাখে না। এটি সমস্ত বাইটের ক্রম। কিছু অ্যাপ্লিকেশনগুলি সেই বাইটগুলি পাঠ্য হিসাবে ব্যাখ্যা করতে পারে তবে স্পষ্টতই তা নয় wc -cযা বাইটের সংখ্যার প্রতিবেদন করে।
স্টাফেন চেজেলাস

22

এই স্ক্রিপ্টটি ফাইলের আকার গণনা করার জন্য বিভিন্ন উপায়ে একত্রিত করে:

(
  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


9

স্ট্যাটে সবচেয়ে কম সিস্টেম কল দিয়ে এটি করা দেখা যাচ্ছে:

$ 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

8

ls -l filename ফাইলের আকার, অনুমতি এবং মালিক সহ কোনও ফাইল সম্পর্কে আপনাকে প্রচুর তথ্য দেবে।

পঞ্চম কলামে ফাইলের আকার এবং বাইটে প্রদর্শিত হয়। নীচের উদাহরণে ফাইলসাইজটি কেবল 2KB এর নীচে রয়েছে:

-rw-r--r-- 1 user owner 1985 2011-07-12 16:48 index.php

সম্পাদনা করুন: এটি সম্ভবত statকমান্ডের মতো নির্ভরযোগ্য নয় ।


আমি মনে করি ls -lএবং statকমান্ড উভয়ই নির্ভরযোগ্য আকারের তথ্য দেয়। আমি এর বিপরীতে কোনও রেফারেন্স পাইনি। ls -sব্লকের সংখ্যায় আকার দেবে।
dabest1

2
@ ড্যাবেস্ট 1 এটি এমন এক অর্থে বিশ্বাসযোগ্য নয় যে অন্য ইউনিক্সে, তাদের আউটপুট আলাদা হতে পারে (এবং কিছু ইউনিক্সে এটিও)।
ইউজিন বুজাক

হ্যাঁ, আইআইআরসি, সোলারিস গ্রুপের নামটি ডিফল্টরূপে প্রদর্শন করেনি, ফলে আউটপুটে কম কলামের দিকে যায়।
এডওয়ার্ড ফালক

যেহেতু আকারটি বিশুদ্ধ সংখ্যাসূচক, শ্বেত স্পেস দ্বারা বেষ্টিত এবং তারিখের বছরটি শুদ্ধ সংখ্যাযুক্ত, নির্ধারিত ফর্ম্যাটে, ব্যবহারকারী + মালিককে এক ক্ষেত্র হিসাবে বিবেচনা করার জন্য একটি রেজিএক্সপ্যাক ব্যবহার করা সম্ভব হবে, গ্রুপটি উপস্থিত ছিল কি না। (পাঠকের জন্য অনুশীলন!)
মাইকডাব্লু

5

du filename আপনাকে বাইটে ডিস্কের ব্যবহার বলবে।

আমি পছন্দ করি du -h filename, যা আপনাকে একটি মানব পাঠযোগ্য বিন্যাসে আকার দেয়।


2
যে বা stat -c "%s";)

1
du1024 বাইটের ব্লকগুলিতে আকারের মুদ্রণের এই স্বাদটি কোনও বাইটের সাধারণ গণনা নয়।
পিটার লিয়নস

নোট করুন যে স্ট্যান্ডার্ড du512-বাইট ইউনিটের সংখ্যায় একটি আউটপুট দেয়। জিএনইউ তার পরিবেশে duডাকা না হলে পরিবর্তে কিবিবাইট ব্যবহার POSIXLY_CORRECTকরে।
স্টাফেন চেজেলাস

1
টাইপ ডিরেক্টরি ফাইলগুলির জন্য , এটি ডিরেক্টরিটির ডিস্ক ব্যবহারের পাশাপাশি অন্যান্য সমস্ত ফাইলের মধ্যে (পুনরাবৃত্তভাবে) দেয়।
স্টাফেন চেজেলাস

3

আপনার শেল স্ক্রিপ্টগুলিতে ছোট ইউটিলিটি ফাংশন তৈরি করুন যা আপনি ডেলিগ্রে করতে পারেন।

উদাহরণ

#! /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কোনও ফাইলের সংকোচনেতা পরীক্ষা করতে দেখুন ।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস নিশ্চিত নন যে আমার ধারণা এটির উন্নতি হয়েছিল কিনা। এই ক্ষেত্রে বিবৃতি সহজেই noobs বন্ধ করা যেতে পারে; আমি অবশ্যই কখনই তাদের সঠিকভাবে পেতে পারি না :-) কেস স্টেটমেন্টগুলি অন্তর্নিহিতভাবে আরও বহনযোগ্য কারণ আপনি এটি করেছেন? আমি যখন
দুটিরও

1
আমি মনে করি এটি স্বাদের বিষয়, তবে এখানে এটি সাধারণ ক্ষেত্রে যেখানে আপনি কোনও caseবিবৃতি ব্যবহার করতে চান । caseপ্যাটার্ন ম্যাচিংয়ের জন্য বোর্ন / পসিক্স কনস্ট্রাক্ট। [[...]]কেবলমাত্র ksh / bash / zsh (বৈচিত্র সহ)।
স্টাফেন চেজেলাস

2

আমি একটি এডব্লিউকে 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


1
ওপি যা বলেছিল তা পুরোপুরি নয়, তবে কাজের ছোট্ট অংশ।
জিপসি স্পেলওয়েভার

0

অন্য একটি পসিক্স অনুগত উপায় হ'ল নতুন লাইন অক্ষরগুলি বাদ দিয়ে ইনপুট ফাইলের প্রতিটি লাইনের অক্ষরে দৈর্ঘ্য ফিরিয়ে আনার জন্য 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 টি প্রিন্ট করা উচিত
আইজাক

-1

আমি নিজে ডাব্লুসি বিকল্প পছন্দ করি। 'বিসি' দিয়ে যুক্ত, আপনি যত খুশি ঠিক তত জায়গায় দশমিক পেতে পারেন।

আমি একটি স্ক্রিপ্টের উন্নতি করতে চেয়েছিলাম যা আমার কাছে একটি '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


1
আমি "স্ট্যাট" বা "এলএস" ব্যবহার করতে পছন্দ করব। সাধারণত আমি ফাইলের আকার পেতে "ডাব্লুসি" ব্যবহার করতে পছন্দ করি না কারণ এটি পুরো ফাইলটি শারীরিকভাবে পড়ে। আপনার কাছে যদি প্রচুর ফাইল বা বিশেষত বড় ফাইল থাকে তবে এটি অনেক সময় নিতে পারে। তবে আপনার সমাধানটি সৃজনশীল ... + 1।
কেভিন ফেগান

2
আমি ফাইলাইজের জন্য "ডাব্লুসি" এর উপর "স্ট্যাট" ব্যবহার করার ধারণার সাথে একমত, তবে আপনি যদি "ডাব্লুসি-সিসি" ব্যবহার করেন তবে কোনও ডেটা পড়বে না; পরিবর্তে lseek কোনও ফাইলের বাইট সংখ্যা নির্ধারণ করতে ব্যবহৃত হবে। lingrok.org/xref/coreutils/src/wc.c#228
বিবাজা 42

1
@ বিবাজা :২: নোট করুন যে জিএনইউ করিউটিলগুলি wcফাইলের শেষ ব্লকটি পড়তে পারে, যদি stat.st_sizeকেবলমাত্র একটি আনুমানিকতা ছিল (যেমন লিনাক্স /procএবং /sysফাইলগুলির জন্য)। আমি অনুমান করি যে তারা যখন যুক্তিটিকে কয়েক লাইনে যুক্ত করেছেন তখন তারা মূল মন্তব্যটি আরও জটিল না করার সিদ্ধান্ত নিয়েছেন: lingrok.org/xref/coreutils/src/wc.c#246
পিটার

-1

দ্রুততম এবং সহজতম (আইএমও) পদ্ধতিটি হ'ল:

bash_var=$(stat -c %s /path/to/filename)

2
তারপরে স্ট্যাটাসের উল্লেখ থাকা বিদ্যমান উত্তরগুলির এক বা একাধিককে আপগেট করুন; এটির পুনরাবৃত্তি করার দরকার নেই ...
জেফ শ্যাচলার

1
@ জেফ শ্যাচলার আমি আপনার নির্দেশাবলীতে স্টিফেনের উত্তরটি সবেমাত্র উত্সাহিত করেছি। আমি মনে করি এটি আমার উদ্দেশ্যগুলির জন্য খুব জটিল। আমি কেন এই সাধারণ উত্তরটি মনের মত প্রাণীদের জন্য পোস্ট করেছি।
WinEunuuchs2Unix

1
ধন্যবাদ; এটি কেবলমাত্র "স্ট্যাটাস" উত্তরের ষষ্ঠ উদাহরণটি এই প্রশ্নোত্তরকে সহজ করে না, বরং একটি নতুন পাঠককে তাদের জিজ্ঞাসা করবে যে "এই উত্তরটি অন্যগুলির থেকে কীভাবে আলাদা?" এবং কম পরিবর্তে আরও বিভ্রান্তির দিকে নিয়ে যায়।
জেফ শ্যাচলার

@ জেফশ্যাচলার আমার ধারণা তবে আমি অনেকগুলি duএবং wcউত্তরগুলির বিষয়ে অভিযোগ করতে পারি যেগুলির সত্যিকারের জীবনে এটি করার আগে কখনও অস্বীকার করা উচিত । আমি আজ রাতে আমার উত্তরটি একটি বাস্তব জীবনের প্রয়োগে ব্যবহার করেছি এবং ভেবেছিলাম এটি ভাগ করে নেওয়া সার্থক। আমি অনুমান করি যে আমাদের সকলের মতামত সঙ্কুচিত আছে
WinEunuuchs2Unix
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.