শেল ফাইলের আকার (বাইটে) পাওয়ার পোর্টেবল উপায়?


121

লিনাক্সে, আমি ব্যবহার করি stat --format="%s" FILEতবে সোলারিসের আমার কাছে স্ট্যাট কমান্ড নেই access আমার তখন কী ব্যবহার করা উচিত?

আমি ব্যাশ স্ক্রিপ্টগুলি লিখছি, এবং সিস্টেমটিতে সত্যই কোনও নতুন সফ্টওয়্যার ইনস্টল করতে পারছি না।

আমি ইতিমধ্যে ব্যবহার বিবেচনা করেছি:

perl -e '@x=stat(shift);print $x[7]' FILE

অথবা এমনকি:

ls -nl FILE | awk '{print $5}'

তবে এগুলির কোনওটিই বোধগম্য নয় - কেবল ফাইলের আকার পেতে পার্ল চালাচ্ছেন? বা একই কাজ করতে 2 কমান্ড চালাচ্ছেন?


1
ভাল একটি বাশ স্ক্রিপ্ট হ'ল সফ্টওয়্যার, এবং যদি আপনি এটি সিস্টেমে রাখতে পারেন তবে আপনি সফ্টওয়্যার ইনস্টল করতে পারেন।
কেবলমাত্র

4
প্রযুক্তিগতভাবে - সত্য। আমি বোঝাতে চাইছি যে আমার কাছে রুট সুবিধা নেই এবং নতুন প্যাকেজ ইনস্টল করতে পারছি না। অবশ্যই হোম ডিরে ইনস্টল করা সম্ভব। তবে সত্যিই নয় যখন আমাকে স্ক্রিপ্টটি পোর্টেবল করতে হবে এবং "এক্স" মেশিনে ইনস্টল করার সাথে সাথে নতুন অতিরিক্ত প্যাকেজগুলি জটিল হয়ে উঠবে।

উত্তর:


207

wc -c < filename(শব্দের গণনার জন্য সংক্ষিপ্ত, -cবাইট গণনা প্রিন্ট করে) একটি বহনযোগ্য, পসিক্স সমাধান। প্ল্যাটফর্মগুলিতে কেবলমাত্র আউটপুট ফর্ম্যাটটি একরকম নাও হতে পারে কারণ কিছু স্থান ফাঁকা হয়ে যেতে পারে (যা সোলারিসের ক্ষেত্রে)।

ইনপুট পুনর্নির্দেশটি বাদ দিবেন না। ফাইলটি যখন আর্গুমেন্ট হিসাবে পাস করা হয়, তখন ফাইলটির নাম বাইট গণনা শেষে মুদ্রিত হয়।

আমি চিন্তিত ছিলাম এটি বাইনারি ফাইলগুলির জন্য কাজ করবে না, তবে এটি লিনাক্স এবং সোলারিস উভয় ক্ষেত্রেই ঠিক আছে। আপনি এটি দিয়ে চেষ্টা করতে পারেন wc -c < /usr/bin/wc। তদতিরিক্ত, POSIX ইউটিলিটিগুলি বাইনারি ফাইলগুলি হ্যান্ডেল করার গ্যারান্টিযুক্ত , যদি না অন্যথায় স্পষ্টভাবে নির্দিষ্ট করা থাকে।


67
অথবা wc -c < fileআপনি যদি ফাইলের নামটি প্রদর্শিত না চান তবেই।
ক্যাফে

34
আমি যদি ভুল না হয়ে যাই, তবে wcপাইপলাইনে read()বাইটগুলি গণনা করতে অবশ্যই পুরো স্ট্রিমটি আবশ্যক । ls/ awkসমাধান (এবং অনুরূপ) একটি সিস্টেম কল ব্যবহার আকার, যা পেতে উচিত রৈখিক সময় হতে (বনাম হে (আকার))
jmtd

1
আমি স্মরণ করছি wcযখন আমি একটি হার্ড হার্ড ডিস্কে শেষ বারটি করছিলাম তখন খুব ধীর হয়ে পড়েছিল। এটি যথেষ্ট ধীর ছিল যে আমি প্রথমটি শেষ হওয়ার আগে স্ক্রিপ্টটি পুনরায় লিখতে পারি, আমি কীভাবে এটি করলাম তা স্মরণ করতে এখানে এসেছিল।
ক্যামিলো মার্টিন

6
আমি ব্যবহার করব না wc -c; এটি দেখতে অনেক বেশি সুন্দর তবে গতি / সংস্থান ব্যবহারের জন্য ls+ awkভাল। এছাড়াও, আমি কেবল এটিই উল্লেখ করতে চেয়েছিলাম যে ফলাফলগুলি পোস্ট-প্রক্রিয়া করার wcপাশাপাশি আপনারও দরকার কারণ ফলাফলের আগে কিছু সিস্টেমে এটির সাদা অংশ থাকতে পারে, যা তুলনা করার আগে আপনাকে স্ট্রিপ লাগতে পারে।
হারাভিক্ক

3
wc -cদুর্দান্ত, তবে আপনি যদি ফাইলে অ্যাক্সেস না পান তবে এটি কাজ করবে না।
সিলাস

41

আমি কেবল নিজের আকারটি প্রদর্শন করতে নিজের প্রোগ্রামটি (সত্যিই ছোট) লিখে শেষ করেছি। এখানে আরও তথ্য: http://fwhacking.blogspot.com/2011/03/bfsize-print-file-size-in-bytes-and.html

লিনাক্সের সাধারণ সরঞ্জামগুলির সাথে আমার মতে সবচেয়ে দুটি পরিষ্কার উপায় হ'ল:

$ stat -c %s /usr/bin/stat
50000

$ wc -c < /usr/bin/wc
36912

তবে আমি কেবল কোনও ফাইল আকার পেতে প্যারামিটারগুলি টাইপ করতে বা আউটপুটটি পাইপ করতে চাই না, তাই আমি আমার নিজের বিএফসাইজ ব্যবহার করছি।


2
সমস্যার বর্ণনার প্রথম লাইনে বলা হয়েছে যে স্ট্যাটটি কোনও বিকল্প নয়, এবং ডাব্লুসি-সি এখন এক বছরেরও বেশি সময় ধরে শীর্ষের উত্তর, সুতরাং আমি নিশ্চিত নই যে এই উত্তরটির বিন্দুটি কী।

22
বিন্দু আমার মত মানুষেরা যারা Google এ এই তাই প্রশ্ন খুঁজে পেতে এবং হয় stat হয় তাদের জন্য একটি বিকল্প।
yo '

3
আমি একটি এমবেডেড সিস্টেমে কাজ করছি যেখানে wc -c10 এমবি ফাইলের তুলনায় 4090 এমসিতে লাগে "0" এমসির জন্য stat -c %s, তবে আমি সম্মত হই যে তারা ঠিক উত্থাপিত প্রশ্নের সঠিক উত্তর না দিলেও বিকল্প সমাধান পাওয়া সহায়ক।
রবার্ট ক্যালহাউন

3
"স্ট্যাটাস-সি" পোর্টেবল নয় / ম্যাকওএসে লিনাক্সের মতো একই যুক্তি গ্রহণ করে না accept "wc -c" বড় ফাইলগুলির জন্য খুব ধীর হবে।
ওড়ওলোফিল

2
স্ট্যাটটিও বহনযোগ্য নয়। stat -c %s /usr/bin/stat stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]

27

যদিও duসাধারণত ডিস্কের ব্যবহার মুদ্রণ করে এবং প্রকৃত ডেটা আকার নয়, জিএনইউ কোর্টিলগুলি duফাইলের "আপাত আকার" মুদ্রণ করতে পারে:

du -b FILE

তবে এটি বিএসডি, সোলারিস, ম্যাকস, ... এর অধীনে কাজ করবে না


3
ম্যাকস এক্স-এ, brew install coreutilsএবং gdu -bএকই প্রভাবটি অর্জন করবে
জোসে অ্যালবান

1
আমি এই পদ্ধতিটি পছন্দ করি কারণ wcফলাফল দেওয়ার জন্য পুরো ফাইলটি পড়া দরকার, duতাত্ক্ষণিক।
কাজিনকোচেন

2
পসিএক্স যৌক্তিক ক্ষেত্রেdu -b সম্পূর্ণ ভিন্ন প্রসঙ্গে উল্লেখ করেছে । du
প্লেকে

এটি কেবল lstatকলটি ব্যবহার করে তাই এর কার্যকারিতা ফাইল আকারের উপর নির্ভর করে না। এর চেয়ে stat -c '%s'কম, তবে স্বল্পজ্ঞানযুক্ত এবং ফোল্ডারগুলির জন্য আলাদাভাবে কাজ করে (প্রতিটি ফাইলের অভ্যন্তরের আকারের আকার প্রিন্ট করে)।
প্লেক

ফ্রিবিএসডিdu ব্যবহার করে কাছাকাছি যেতে পারে du -A -B1, তবে এটি এখনও 1024 বি ব্লকের গুণকে ফলাফল মুদ্রণ করে। বাইটস গণনা মুদ্রণ করতে এটি পরিচালনা করে না। এমনকি BLOCKSIZE=1এনভায়রোনমেন্টে সেট করাও সহায়তা করে না, কারণ 512 বি ব্লক তখন ব্যবহৃত হয়।
প্লেকে

13

অবশেষে আমি ls, এবং ব্যাশের অ্যারে প্রসারণটি ব্যবহার করার সিদ্ধান্ত নিয়েছি:

TEMP=( $( ls -ln FILE ) )
SIZE=${TEMP[4]}

এটি সত্যিই দুর্দান্ত নয়, তবে কমপক্ষে এটি কেবলমাত্র 1 টি কাঁটাচামচ চালায় + এবং এটি গৌণ প্রোগ্রামিং ভাষার উপর নির্ভর করে না (পার্ল / রুবি / পাইথন / যাই হোক না কেন)


কেবল একপাশে - 'ln' এ 'l' প্রয়োজন হয় না; '-n' হ'ল '-ln' এর
মতোই

না এইটা না. শুধু আউটপুট তুলনা করুন।

1
কেউ অনুমান করতে পারবেন যে ls -ln FILE | { read _ _ _ _ size _ && echo "$size"; }পাইপলাইনটির দ্বিতীয় ধাপের জন্য পোর্টেবলের কাঁটাচামচার দরকার নেই, কারণ এটি কেবল বিল্ট-ইনগুলি ব্যবহার করে, তবে লিনাক্স কাঁটাচামুতে দু'বার 4.2.37 নম্বরে (এখনও কেবল একটি execve, যদিও)।
প্লেক

read _ _ _ _ size _ <<<"$(exec ls -ln /usr/bin/wc)" && echo "$size"একক কাঁটাচামচ এবং একক এক্সিকিউটে কাজ করে তবে এটি এখানে স্ট্রিংয়ের জন্য একটি অস্থায়ী ফাইল ব্যবহার করে। এটি পসএক্স-সম্মতিযুক্ত এখানে-নথির সাথে এখানে-স্ট্রিং প্রতিস্থাপন করে পোর্টেবল তৈরি করা যায় । বিটিডাব্লু execসাব-শেলের মধ্যে নোট করুন । তা ছাড়া বাশ সাব শেলের জন্য একটি কাঁটাচামচ করে এবং অন্যটি ভিতরে কমান্ডের জন্য ব্যবহার করে। আপনি এই উত্তরে যে কোডটি সরবরাহ করেছেন এটি ক্ষেত্রে এটি। খুব।
প্লেকে

1
-lউপস্থিতিতে প্রযোজন নেই -n। বরাত দিয়ে POSIX lsর manpage : -nচালু করুন: -l(ইএলএল) বিকল্প, কিন্তু ফাইলের মালিক বা গ্রুপ লেখা, ফাইলের সাংখ্যিক ইউআইডি বা GID বরং লিখতে ব্যবহারকারী বা গ্রুপের নাম চেয়ে যথাক্রমে। অক্ষম -C, -mএবং -xঅপশন।
প্লেকে

8

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

ম্যাকোস, লিনাক্স-এ পরীক্ষিত - সোলারিসের জন্য সামান্য পরিবর্তন প্রয়োজন হতে পারে:

__ln=( $( ls -Lon "$1" ) )
__size=${__ln[3]}
echo "Size is: $__size bytes"

যদি প্রয়োজন হয়, ls আর্গুমেন্টগুলি সহজ করুন এবং off {__ ln [3]} এ অফসেট সামঞ্জস্য করুন}

দ্রষ্টব্য: symlinks অনুসরণ করবে।


1
বা এটি একটি শেল স্ক্রিপ্টে রাখুন: ls -Lon "$ 1" | awk '{মুদ্রণ $ 4}'
লুসিয়ানো

1
@Luciano আমি তোমাদের সম্পূর্ণভাবে বিন্দু মিস করেছেন মনে forking না এবং একটি টাস্ক করছেন ব্যাশ বরং স্ট্রিং থেকে ব্যাশ UNIX অনেকটা একটি অদক্ষ ফ্যাশন একসঙ্গে কমান্ড ব্যবহার করে।
অরওলোফিল

8

BSD গুলোর আছে statগনুহ coreutils এক থেকে বিভিন্ন অপশন, কিন্তু অনুরূপ ক্ষমতা।

stat -f %z <file name> 

এটি ম্যাকোস (10.12 এ পরীক্ষিত), ফ্রিবিএসডি , নেটবিএসডি এবং ওপেনবিএসডি- তে কাজ করে ।


statযদিও সোলারিসের কোনও উপযোগ নেই ।
প্লেকে

6

ls -nআউটপুট প্রক্রিয়াজাতকরণের সময় , অসুস্থ-পোর্টেবল শেল অ্যারের বিকল্প হিসাবে, আপনি অবস্থানগত আর্গুমেন্টগুলি ব্যবহার করতে পারেন, যা একমাত্র অ্যারে গঠন করে এবং স্ট্যান্ডার্ড শেলের একমাত্র স্থানীয় ভেরিয়েবল। আপনার স্ক্রিপ্ট বা ফাংশনে আসল আর্গুমেন্টগুলি সংরক্ষণ করার জন্য কোনও ফাংশনগুলিতে অবস্থানগত আর্গুমেন্টের ওভাররাইট মোড়ানো।

getsize() { set -- $(ls -dn "$1") && echo $5; }
getsize FILE

এটি ln -dnবর্তমান IFSপরিবেশের পরিবর্তনশীল সেটিংস অনুসারে আউটপুটকে বিভক্ত করে , অবস্থানগত আর্গুমেন্টগুলিতে নির্ধারিত করে এবং পঞ্চমটি প্রতিধ্বনিত করে। -dনিশ্চিত ডিরেক্টরি সঠিকভাবে পরিচালনা করা হয় এবং -nআশ্বাস দেয় যে, ব্যবহারকারী এবং গ্রুপ নাম প্রয়োজন হবে না সঙ্গে মতো মীমাংসা করার -l। এছাড়াও, হোয়াইটস্পেসযুক্ত ব্যবহারকারী এবং গোষ্ঠীর নামগুলি তাত্ত্বিকভাবে প্রত্যাশিত রেখার কাঠামোটি ভেঙে দিতে পারে; এগুলি সাধারণত অনুমোদিত নয় তবে এই সম্ভাবনাটি এখনও প্রোগ্রামারকে থামিয়ে এবং চিন্তাভাবনা করে।


5

আপনি যদি findজিএনইউ ফাইল্টিলগুলি থেকে ব্যবহার করেন:

size=$( find . -maxdepth 1 -type f -name filename -printf '%s' )

দুর্ভাগ্যক্রমে, অন্যান্য বাস্তবায়ন findসাধারণত সমর্থন করে না -maxdepth, বা না -printf। এটি উদাহরণস্বরূপ সোলারিস এবং ম্যাকোসের ক্ষেত্রে find


এফওয়াইআই ম্যাক্সডেপথের দরকার নেই। এটি আবার লিখতে পারে size=$(test -f filename && find filename -printf '%s')
প্লেক

@ প্যালেক: পুনরাবৃত্ত -maxdepthহওয়া findথেকে রোধ করার উদ্দেশ্য (যেহেতু statওপি প্রতিস্থাপন করা দরকার তা নয়)) আপনার findকমান্ডটি একটি অনুপস্থিত -nameএবং testকমান্ডটি প্রয়োজনীয় নয়।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ ডেনিস উইলিয়ামসন findপ্রদত্ত মানদণ্ডের সাথে মেলে এমন ফাইলগুলির জন্য এর পরামিতিগুলি পুনরাবৃত্তি করে অনুসন্ধান করে। যদি প্যারামিটারগুলি ডিরেক্টরি না হয় তবে পুনরাবৃত্তি হ'ল ... বেশ সহজ। অতএব আমি প্রথমে পরীক্ষা করে filenameদেখি যে সত্যই একটি বিদ্যমান সাধারণ ফাইল এবং তারপরে আমি এর আকারটি findপুনরুক্তার কোথাও ব্যবহার করে মুদ্রণ করি ।
প্যালেক

1
find . -maxdepth 1 -type f -name filename -printf '%s'ফাইলটি যদি বর্তমান ডিরেক্টরিতে থাকে কেবল তখনই কাজ করে এবং এটি এখনও ডিরেক্টরিতে প্রতিটি ফাইল পরীক্ষা করতে পারে যা ধীর হতে পারে। আরও ভাল ব্যবহার (এমনকি আরও খাটো!) find filename -maxdepth 1 -type f -printf '%s'
প্লেকে

3

আপনি findকিছু সেট ফাইল পেতে কমান্ড ব্যবহার করতে পারেন (এখানে অস্থায়ী ফাইলগুলি বের করা হয়)। তারপরে আপনি সুইচ duব্যবহার করে মানব পাঠযোগ্য ফর্মের প্রতিটি ফাইলের ফাইলের আকার পেতে কমান্ডটি ব্যবহার করতে পারেন -h

find $HOME -type f -name "*~" -exec du -h {} \;

আউটপুট:

4.0K    /home/turing/Desktop/JavaExmp/TwoButtons.java~
4.0K    /home/turing/Desktop/JavaExmp/MyDrawPanel.java~
4.0K    /home/turing/Desktop/JavaExmp/Instream.java~
4.0K    /home/turing/Desktop/JavaExmp/RandomDemo.java~
4.0K    /home/turing/Desktop/JavaExmp/Buff.java~
4.0K    /home/turing/Desktop/JavaExmp/SimpleGui2.java~

2

আপনি প্রথমে পার্ল উদাহরণটি আমার কাছে অযৌক্তিক দেখায় না।

এটি এর কারণগুলির জন্য যে আমি শেল স্ক্রিপ্টগুলি (বাশ / শ ইত্যাদি) রচনা থেকে পার্লের সবচেয়ে তুচ্ছ স্ক্রিপ্টগুলি ব্যতীত অন্য সমস্ত লেখায় স্থানান্তরিত হয়েছি। আমি দেখতে পেয়েছি যে আমি বিশেষ প্রয়োজনীয়তার জন্য পার্ল চালু করতে যাচ্ছি এবং আরও আরও বেশি করে আমি বুঝতে পেরেছিলাম যে পার্লে লিপিগুলি সম্ভবত আরও শক্তিশালী ছিল (ভাষা এবং সিপিএএন এর মাধ্যমে উপলব্ধ গ্রন্থাগারের বিস্তৃত বিন্যাসের দিক থেকে) ) এবং আমি যা চাই তা অর্জনের আরও কার্যকর উপায়।

মনে রাখবেন যে অন্যান্য শেল-স্ক্রিপ্টিং ভাষার (যেমন পাইথন / রুবি) কোনও সন্দেহ নেই, সন্দেহ নেই এবং আপনি আপনার উদ্দেশ্যে এগুলি মূল্যায়ন করতে চাইতে পারেন। আমি কেবল পার্লকেই আলোচনা করি যেহেতু আমি যে ভাষাটি ব্যবহার করি এবং তার সাথে পরিচিত familiar


ঠিক আছে, আমি নিজেই অনেকগুলি পার্ল লেখার চেষ্টা করি তবে কখনও কখনও এই সরঞ্জামটি আমার দ্বারা বেছে নেওয়া হয়, আমার দ্বারা নয় :)

-3

যদি আপনার সোলারিসে পার্ল থাকে তবে এটি ব্যবহার করুন। অন্যথায়, এলএসকে উইন্ড সহ আপনার পরবর্তী সেরা বাজি, যেহেতু আপনার স্ট্যাটাস নেই বা আপনার সন্ধান GNU সন্ধান নয়।


-3

আমি ব্যবহার করেছি সোলারিসে একটি কৌশল আছে, আপনি যদি একাধিক ফাইলের আকারের জন্য জিজ্ঞাসা করেন তবে এটি কোনও নাম ছাড়াই মোট আকারটি দেয় - সুতরাং দ্বিতীয় ফাইলের মতো একটি খালি ফাইল / dev / নাল অন্তর্ভুক্ত করুন:

উদাহরণস্বরূপ ফাইলআউওয়ান্ট / দেব / নাল কমান্ড

Ls / wc / ইত্যাদির জন্য কোন আকারের কমান্ড এটি কাজ করে তা আমি মনে করতে পারি না - দুর্ভাগ্যক্রমে এটি পরীক্ষা করার জন্য আমার কাছে সোলারিস বাক্স নেই।


-4

লিনাক্সে আপনি ব্যবহার করতে পারেন du -h $FILE, এটি কি সোলারিসের উপর কাজ করে?


1
প্রকৃতপক্ষে, ইউনিট রূপান্তরিত হতে পারে তবে এটি ফাইল ডেটার আকারের ("আপাত আকার") এর পরিবর্তে ডিস্কের ব্যবহার দেখায়।
প্লেলে

-7

আপনি কি ডু-এস চেষ্টা করেছেন? awk '{মুদ্রণ $ 1 * 1024।'। এটা কেবল কাজ করতে পারে।


1
এটি ফাইল ডেটার আকারের পরিবর্তে ডিস্কের ব্যবহার দেখায় ("আপাত আকার")।
প্লেলে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.