বাশ ব্যবহার করে কোনও ফাইলের আকার কীভাবে পরীক্ষা করবেন?


145

আমি একটি স্ক্রিপ্ট পেয়েছি যা 0-আকারের জন্য যাচাই করে তবে আমি ভেবেছিলাম পরিবর্তে ফাইলের আকারগুলি পরীক্ষা করার আরও সহজ উপায় থাকতে হবে। অর্থাৎ file.txtসাধারণত 100 কে; স্ক্রিপ্টটি কীভাবে এটি 90 কে (0 সহ) এর চেয়ে কম হয় তা যাচাই করবেন এবং ফাইলটি এই ক্ষেত্রে দুর্নীতিগ্রস্থ হওয়ায় এটি একটি নতুন অনুলিপি তৈরি করবেন।

আমি বর্তমানে যা ব্যবহার করছি ..

if [ -n file.txt ]
then
 echo "everything is good"
else
 mail -s "file.txt size is zero, please fix. " myemail@gmail.com < /dev/null
 # Grab wget as a fallback 
 wget -c https://www.server.org/file.txt -P /root/tmp --output-document=/root/tmp/file.txt
 mv -f /root/tmp/file.txt /var/www/file.txt
fi

উত্তর:


250

[ -n file.txt ]এর আকারটি পরীক্ষা করে না, এটি পরীক্ষা করে যে স্ট্রিংটি file.txtশূন্য-দৈর্ঘ্যের নয়, তাই এটি সর্বদা সফল হবে।

আপনি বলতে চান তাহলে "আকার নন-জিরো হয়", আপনি প্রয়োজন [ -s file.txt ]

কোনও ফাইলের আকার পেতে, আপনি wc -cআকার (ফাইলের দৈর্ঘ্য) বাইটে পেতে ব্যবহার করতে পারেন :

file=file.txt
minimumsize=90000
actualsize=$(wc -c <"$file")
if [ $actualsize -ge $minimumsize ]; then
    echo size is over $minimumsize bytes
else
    echo size is under $minimumsize bytes
fi

এই ক্ষেত্রে, এটি আপনি চান যা মনে হচ্ছে।

তবে এফওয়াইআই, আপনি যদি ফাইলটি কতটা ডিস্ক স্পেস ব্যবহার করছেন তা জানতে চান, আপনি du -kকিলোবাইটে আকার (ডিস্কের স্থান ব্যবহৃত) পেতে ব্যবহার করতে পারেন :

file=file.txt
minimumsize=90
actualsize=$(du -k "$file" | cut -f 1)
if [ $actualsize -ge $minimumsize ]; then
    echo size is over $minimumsize kilobytes
else
    echo size is under $minimumsize kilobytes
fi

আপনার যদি আউটপুট ফর্ম্যাটটিতে আরও নিয়ন্ত্রণের প্রয়োজন হয় তবে আপনি এটিও দেখতে পারেন stat। লিনাক্সে, আপনি এমন কিছু দিয়ে শুরু করতে stat -c '%s' file.txtএবং BSD / Mac OS X- তে শুরু করেছিলেন stat -f '%z' file.txt


5
এর du -b "$file" | cut -f 1বদলে কেন stat -c '%s' "$file"? নাকি stat --printf="%s" "$file"?
mivk

1
কেবলমাত্র এটি আরও বহনযোগ্য because বিএসডি এবং লিনাক্সের stat পৃথক পতাকা রয়েছে।
মাইকেল

1
... | cut -d' ' -f1উবুন্টুতে এটি কাজ করার জন্য আমাকে এটি পরিবর্তন করতে হয়েছিল ।
মাইকপোট

8
ব্যবহার করুন wc -c < "$file"(দ্রষ্টব্য <), এক্ষেত্রে আপনার | cut ...অংশের প্রয়োজন নেই (যা পোস্ট হিসাবে, ওএসএক্সে কাজ করে না)। ওএসএক্সের BLOCKSIZEজন্য সর্বনিম্ন মান । du512
mklement0

3
@ পেট্রিসির্ককলা আমার লিনাক্স সিস্টেমেও wc -c <filenameব্যবহার করে fstatএবং seek? নোট যা fstatকোনও এফডি লাগে, কোনও পথের নাম নয়।
মাইকেল

24

এটি আমাকে অবাক করে দেয় যে কেউ statফাইলের আকার চেক করার জন্য উল্লেখ করেনি । কিছু পদ্ধতি অবশ্যই ভাল: -sফাইলটি খালি আছে কি না তা অনুসন্ধানের জন্য ব্যবহার করা যদি আপনি চান তবে অন্য কোনও কিছুর চেয়ে সহজ easier এবং যদি আপনি করতে চান এটি একটি আকার ফাইল, তারপর findঅবশ্যই যেতে উপায়।

আমি duকেবিতে ফাইলের আকার পেতে খুব চাই , তবে, বাইটগুলির জন্য, আমি ব্যবহার করব stat:

size=$(stat -f%z $filename) # BSD stat

size=$(stat -c%s $filename) # GNU stat?

2
statএকটি দুর্দান্ত ধারণা, তবে সেন্টোসের ক্ষেত্রে এটিই আমার পক্ষে কাজ করেছিল:size=$(stat -c%s $filename)
ওজ সলোমন

2
GNU এবং BSD এর মধ্যে পার্থক্য হ'ল দুর্ভাগ্যক্রমে, এই বিকল্পটিকে কিছুটা আকর্ষণীয় করে তোলে। :(
lapo

1
ফাইল বিচ্ছিন্ন হলে স্টেট বিভ্রান্তিকর হতে পারে। আপনি ব্যবহৃত স্থান গণনা করতে স্ট্যাটাস দ্বারা রিপোর্ট করা ব্লকগুলি ব্যবহার করতে পারেন।
অজিথ অ্যান্টনি

@ অজিথ অ্যান্টনি এটি একটি আকর্ষণীয় বিষয় যা আমার কাছে ঘটেনি। আমি দেখতে পাচ্ছি কিছু পরিস্থিতিতে সঠিক জিনিস statহ'ল , এবং স্পার্স ফাইলগুলি বেশিরভাগ পরিস্থিতিতে প্রাসঙ্গিক নয়, যদিও অবশ্যই সমস্তটি নয়।
ড্যানিয়েল সি সোব্রাল

17

বিশ্রী ও ডাবল প্রথম বন্ধনী সহ বিকল্প সমাধান:

FILENAME=file.txt
SIZE=$(du -sb $FILENAME | awk '{ print $1 }')

if ((SIZE<90000)) ; then 
    echo "less"; 
else 
    echo "not less"; 
fi

1
দুর্দান্ত, তবে ওএসএক্সে কাজ করবে না, যেখানে duসমর্থন করে না -b। (এটি সচেতন শৈলীর পছন্দ হতে পারে তবে কেবল বিকল্পটি উল্লেখ করতে হবে : ভেরিয়েবলগুলি উল্লেখ করার সময় আপনি $অভ্যন্তরের উপসর্গটি বাদ দিতে পারেন :)(( ... ))((SIZE<90000))
এমকিলেমেন্ট 0

1
প্রকৃতপক্ষে এটি পূর্ববর্তী ব্যবহারকারীর সম্পাদনা ছিল যিনি ভাবেন যে এটি ভুল করা উচিত$
fstab

2
@fstab, আপনি ( অভ্যন্তরীণ কমান্ড) awkব্যবহার করে বাদ দিতে পারেন :readbashread SIZE _ <<<$(du -sb "$FILENAME")
জ্যামেডিয়ান

13

যদি আপনার findএই সিনট্যাক্সটি পরিচালনা করে তবে আপনি এটি ব্যবহার করতে পারেন:

find -maxdepth 1 -name "file.txt" -size -90k

এটি স্টকআউটতে আউটপুট হবে file.txtযদি এবং শুধুমাত্র এর আকার file.txt90k এর চেয়ে কম হয়। স্ক্রিপ্টটি কার্যকর করতে scriptযদি file.txt90k এর চেয়ে কম আকার থাকে:

find -maxdepth 1 -name "file.txt" -size -90k -exec script \;

3
+1, তবে এটি find . -maxdepth 1 -name "file.txt" -size -90k
ওএসএক্সে

8

আপনি যদি কেবল একটি ফাইলের আকারের সন্ধান করেন:

$ cat $file | wc -c
> 203233

1
এটি সবচেয়ে সংক্ষিপ্ত কার্যক্ষম উত্তর হতে পারে তবে এটি সম্ভবত সবচেয়ে ধীর। :)
সানস্পার্ক

2
হ্যাঁ, তবে অবশ্যই অর্থনৈতিক দিক থেকে উচ্চতর: ইঞ্জিনিয়ারিংয়ের সময়> গণনার সময়ের ব্যয়
কলানিয়েল

8
wc -c "$file"একটি উত্তর হিসাবে 2011 সালে দেওয়া হয়েছিল (তিন বছর আগে)। হ্যাঁ, wc -c "$file"সমস্যাটি এটি ফাইলের নামের পাশাপাশি অক্ষর গণনা থেকেও বেরিয়ে যায় তাই প্রাথমিক উত্তরগুলি গণনা পৃথক করার জন্য একটি আদেশ যোগ করেছিল। তবে wc -c < "$file", যা সমস্যার সমাধান করে, মে 2014-তে একটি মন্তব্য হিসাবে যুক্ত করা হয়েছিল Your আপনার উত্তরটি এর সমতুল্য, বাদে এটি একটি "অকেজো ব্যবহার cat" যুক্ত করে । এছাড়াও, আপনার সমস্ত শেল ভেরিয়েবলের উল্লেখগুলি উদ্ধৃত করা উচিত যদি না আপনার কাছে ভাল কারণ না থাকে।
জি-ম্যান

1
আপনি cat.if [$ (head -c 90000 $ file | wc -c) -lt 90000] এর পরিবর্তে হেড-সি ব্যবহার করে এটিকে আরও দক্ষ করতে পারেন; তারপরে "ফাইল 90k এর চেয়ে ছোট" প্রতিধ্বনিত হয়; ফাই CentOS এ পরীক্ষিত, সুতরাং এটি BSD বা OSX এ কাজ করতে বা নাও করতে পারে।
কেভিন কেইন

@ বনানানিলে কীভাবে এই প্রক্রিয়াটি প্রতি 20 সেকেন্ডে করা যায় যাতে আমি এতক্ষণে ফাইলের আকার বৃদ্ধি করতে পারি?
এ সাহারা

6

এটি লিনাক্স এবং ম্যাকো উভয় ক্ষেত্রেই কাজ করে

function filesize
{
    local file=$1
    size=`stat -c%s $file 2>/dev/null` # linux
    if [ $? -eq 0 ]
    then
        echo $size
        return 0
    fi

    eval $(stat -s $file) # macos
    if [ $? -eq 0 ]
    then
        echo $st_size
        return 0
    fi

    return -1
}

5

স্ট্যাটে কয়েকটি সংখ্যক সিস্টেম কল দিয়ে এটি করতে দেখা যায়:

$ 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

যদি আমি এটি সঠিকভাবে বুঝতে পারি strace du --bytes $1 2>&1 >/dev/null | wc তবে টেপাটিও পাইপ পুনর্নির্দেশের সাহায্যে করা উচিত?: যদি এটি হয় তবে আর্মলিনাক্সের amd64 আর্কিটেকারে (সাধারণত সবকিছুর সর্বশেষ সংস্করণ) আমার জন্য 45 লাইন du, 46 লাইন stat, 47 লাইন wcএবং জন্য 72 লাইন find
ভাসিলিনভিকভ

5
python -c 'import os; print (os.path.getsize("... filename ..."))'

বহনযোগ্য, পাইথনের সমস্ত স্বাদ, স্ট্যাটিক উপভাষায় পরিবর্তনের বিষয়টি এড়িয়ে চলে


4

লিনাক্স এবং ম্যাক ওএস এক্স উভয় (এবং সম্ভবত অন্যান্য বিএসডি) ফাইলের আকার পাওয়ার জন্য, অনেকগুলি বিকল্প নেই এবং এখানে প্রস্তাবিত বেশিরভাগগুলি কেবল একটি সিস্টেমে কাজ করবে।

দেওয়া f=/path/to/your/file,

লিনাক্স এবং ম্যাকের ব্যাশ উভয় ক্ষেত্রে কী কাজ করে :

size=$( perl -e 'print -s shift' "$f" )

অথবা

size=$( wc -c "$f" | awk '{print $1}' )

অন্যান্য উত্তরগুলি লিনাক্সে দুর্দান্ত কাজ করে তবে ম্যাকের ক্ষেত্রে নয়:

  • du-bম্যাকের কোনও বিকল্প নেই এবং ব্লকসিআইজে = 1 টি কৌশল কাজ করে না ("সর্বনিম্ন ব্লকসাইজ হ'ল 512", যা ভুল ফলাফলের দিকে নিয়ে যায়)

  • cut -d' ' -f1 ম্যাকের কারণে কাজ করে না কারণ সংখ্যাটি ডান-প্রান্তিক, সামনের স্থানগুলির সাথে প্যাড করা হতে পারে।

তাই আপনি যদি কিছু নমনীয় প্রয়োজন, তবে হয় এটি এর perl'র -sঅপারেটর, অথবা wc -cজন্য বাঁশি বাজালাম awk '{print $1}'(awk নেতৃস্থানীয় সাদা স্থান উপেক্ষা করা হবে)।

এবং অবশ্যই আপনার বাকী মূল প্রশ্নটি সম্পর্কে -lt(বা -gt) অপারেটরটি ব্যবহার করুন :

if [ $size -lt $your_wanted_size ]; then প্রভৃতি


3
+1 টি; আপনি যদি জানেন যে আপনি কেবল একটি পাটিগণিত প্রসঙ্গে (যেখানে শীর্ষস্থানীয় সাদা স্থান উপেক্ষা করা হবে) আকারটি ব্যবহার করবেন তবে আপনি সহজ করতে পারবেন size=$(wc -c < "$f")(নোটটি নোট করুন <, যার ফলে wcকেবল একটি সংখ্যার প্রতিবেদন করার কারণ রয়েছে )। পুনরায় তুলনা: আরও "বশ-ফুল" if (( size < your_wanted_size )); then ...(এবং এছাড়াও [[ $size -lt $your_wanted_size ]]) ভুলে যাবেন না ।
mklement0

3

Gniourf_gniourf এর উত্তরের ভিত্তিতে,

find "file.txt" -size -90k

file.txtstdout এ লিখবে এবং কেবল যদি এর আকার file.txt90K এর চেয়ে কম হয় এবং

"file.txt" -size -90k -exec আদেশ find ;

90K এর চেয়ে কম আকার commandথাকলে কমান্ডটি কার্যকর করবে file.txt। আমি এটি লিনাক্সে পরীক্ষা করেছি। থেকে find(1),

... কমান্ড লাইন আর্গুমেন্ট নিম্নলিখিত ( -H, -Lএবং -Pঅপশন হয় না) নাম হওয়া নিয়ে যাওয়া ফাইল বা ডিরেক্টরি, পরীক্ষা করা প্রথম যুক্তি হল যে দিয়ে শুরু হয় পর্যন্ত '-', ...

(সামনে জোর দাও).


1
ls -l $file | awk '{print $6}'

ধরে নিচ্ছি যে ls কমান্ড রিপোর্ট করেছে 6 কলামে ফাইলাইজ করা


1

আমি ব্যবহার করেন dus 'এর --thresholdএই জন্য। এই বিকল্পটি সমস্ত সংস্করণে উপলব্ধ কিনা তা নিশ্চিত নয় duতবে এটি জিএনইউর সংস্করণে প্রয়োগ করা হয়েছে।

ডু (1) এর ম্যানুয়াল থেকে উদ্ধৃতি :

-t, --threshold=SIZE
       exclude entries smaller than SIZE if positive, or entries greater
       than SIZE if negative

du --threshold=ওপির ব্যবহারের ক্ষেত্রে ব্যবহার করে আমার সমাধানটি এখানে দেওয়া হয়েছে :

THRESHOLD=90k
if [[ -z "$(du --threshold=${THRESHOLD} file.txt)" ]]; then
    mail -s "file.txt size is below ${THRESHOLD}, please fix. " myemail@gmail.com < /dev/null
    mv -f /root/tmp/file.txt /var/www/file.txt
fi

এর সুবিধাটি হ'ল এটি duসেই বিকল্পের সাথে একটি পরিচিত ফর্ম্যাটে কোনও যুক্তি গ্রহণ করতে পারে - হয় হিসাবে মানুষের মতো 10K, 10MiBবা যা আপনি কখনই স্বাচ্ছন্দ্য বোধ করেন - duহ্যান্ডেলগুলি হওয়ায় যেহেতু আপনাকে ফরম্যাট / ইউনিটগুলির মধ্যে ম্যানুয়ালি রূপান্তর করতে হবে না ।

রেফারেন্সের জন্য, SIZEম্যান পৃষ্ঠা থেকে এই যুক্তির ব্যাখ্যা এখানে :

The SIZE argument is an integer and optional unit (example: 10K is 
10*1024). Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers
of 1000). Binary prefixes can be used, too: KiB=K, MiB=M, and so on.

+1 দুর্দান্ত বিকল্প। দুর্ভাগ্যক্রমে আমাদের মধ্যে কিছু duএটির সমর্থন করে না এমন পুরানো সংস্করণে আটকে রয়েছে । 2013 সালে প্রকাশিত--threshold কোর্টিলস 8.21 এ বিকল্পটি যুক্ত করা হয়েছিল ।
অমিত নাইডু

1

ঠিক আছে, আপনি যদি ম্যাক এ থাকেন তবে এটি করুন: stat -f %z "/Users/Example/config.log" এটিই!

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