bash - কিভাবে একটি ফাইল আকার চেক করতে?




(8)

Bash মধ্যে

if [ -s file.txt ]; then
...
fi

খুব কাজ করবে।

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

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

if [ -n file.txt ]
then
 echo "everything is good"
else
 mail -s "file.txt size is zero, please fix. " [email protected].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

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

find "file.txt" -size -90k

যদি file.txt এর আকার 90K এর চেয়ে কম হয় এবং শুধুমাত্র যদি stdout এ file.txt লিখতে হবে, এবং

find "file.txt" -size -90k -exec command \;

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

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

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


আপনি যদি কেবল একটি ফাইলের আকার খুঁজছেন:

$ cat $file | wc -c
> 203233

এই linux এবং macos উভয় কাজ করে

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
}

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

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

এটি যদি file.txt এর আকার 90k এর চেয়েও কম হয় তবে শুধুমাত্র stdout এ file.txt আউটপুট হবে। File.txt 90k এর চেয়ে কম আকারের একটি স্ক্রিপ্ট script কার্যকর করার জন্য:

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

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

প্রদত্ত f=/path/to/your/file ,

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

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

অথবা

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

অন্যান্য উত্তর লিনাক্সে সূক্ষ্ম কাজ করে, কিন্তু ম্যাকে নয়:

  • du তে Mac- এ একটি -b বিকল্প নেই, এবং BLOCKSIZE = 1 টি কৌশল কাজ করে না ("সর্বনিম্ন ব্লকজাইজ 512", যা একটি ভুল ফলাফলের দিকে পরিচালিত করে)

  • cut -d' ' -f1 ম্যাকে কাজ করে না, তাই নম্বরটি সঠিকভাবে সংলগ্ন হতে পারে, সামনে স্পেস দিয়ে প্যাড করা হয়।

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

এবং অবশ্যই, আপনার অবশিষ্ট প্রশ্নটির সাথে -lt (বা -gt ) অপারেটরটি ব্যবহার করুন:

if [ $size -lt $your_wanted_size ]; then if [ $size -lt $your_wanted_size ]; then ইত্যাদি


স্ট্যাটটি কমপক্ষে সিস্টেম কলগুলির সাথে এটি করতে বলে মনে হচ্ছে:

$ 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 $file | awk '{print $6}'

অনুমান করে যে ls কমান্ড রিপোর্ট কলাম # 6 এ ফাইলাইজ করে





bash