آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

پرسش و پاسخ شماره ۱۰۳

پرسش و پاسخ شماره ۱۰۳

چطور بررسی نمایم که فایل دریک ماه معین یا در یک محدوده تاریخی ویرایش شده است؟

انجام محاسبات مبتنی بر تاریخ در Bash دشوار است، زیرا Bash ساختار داخلی برای محاسبه با تاریخ یا دریافت فوق داده‌هایی مانند زمان ویرایش فایلها ندارد.

برنامه ‎stat(1)‎ وجود دارد، اما حتی در میان سیستم‌عامل‌های مختلف گنو نیز خیلی غیرقابل حمل است. در حالیکه اکثر ماشین‌ها یک stat دارند، تمام آنها شناسه‌ها و ترکیب‌دستوری متفاوتی دارند. بنابراین، اگر اسکریپت باید قابل‌حمل باشد، شما نباید به ‎stat(1)‎ تکیه کنید. یک نمونه دستور داخلی قابل بارگیری به نام finfo وجود دارد که فوق داده‌های فایل را بازیابی می‌کند، اما آن هم به طور پیش‌فرض در دسترس نمی‌باشد.

آنچه ما باید داشته باشیم test (یا ‎[[‎) که می‌تواند بررسی نماید آیا یک فایل قبل یا بعد از فایل دیگری ویرایش گردیده است(با استفاده از ‎-nt‎ یا ‎-ot‎) و touch که می‌تواند فایلهایی با تاریخ ویرایش معین شده ایجاد کند، می‌باشند. با ترکیب اینها می‌توانیم به مقدار قابل ملاحظه‌ای این کار را انجام بدهیم.

برای مثال، تابعی برای بررسی آنکه آیا فایلی در یک بازه معین شده زمانی ویرایش گردیده است:

inTime() {
 set -- "$1" "$2" "${3:-1}" "${4:-1}" "$5" "$6" # Default month & day to 1.
 local file=$1 ftmp="${TMPDIR:-/tmp}/.f.$$" ttmp="${TMPDIR:-/tmp}/.t.$$"
 local fyear=${2%-*} fmonth=${3%-*} fday=${4%-*} fhour=${5%-*} fminute=${6%-*}
 local tyear=${2#*-} tmonth=${3#*-} tday=${4#*-} thour=${5#*-} tminute=${6#*-}

 touch -t "$(printf '%02d%02d%02d%02d%02d' "$fyear" "$fmonth" "$fday" "$fhour" "$fminute")" "$ftmp"
 touch -t "$(printf '%02d%02d%02d%02d%02d' "$tyear" "$tmonth" "$tday" "$thour" "$tminute")" "$ttmp"

 (trap 'rm "$ftmp" "$ttmp"' RETURN; [[ $file -nt $ftmp && $file -ot $ttmp ]])
}

با استفاده از این تابع، می‌توانیم بررسی نماییم که آیا یک فایل در یک محدوده تاریخ ویرایش گردیده است. تابع چند شناسه می‌پذیرد: یک نام فایل، یک محدوده سال، یک دامنه ماه، یک دامنه روز، یک دامنه ساعت، یک دامنه دقیقه. هر دامنه همچنین می‌تواند یک عدد منفرد باشد که در این حالت، ابتدا و انتهای دامنه یکسان خواهد بود. اگر یک دامنه تعیین نشده باشد یا از قلم افتاده باشد، صفر فرض می‌شود(یا 1 در مورد ماه و روز ).

این هم یک مثال کاربردی:

 $ touch -t 198404041300 file
 $ inTime file 1984 04-05 && echo "file was last modified in April of 1984"
 file was last modified in April of 1984
 $ inTime file 2010 01-02 || echo "file was not last modified in January 2010"
 file was not last modified in Januari 2010
 $ inTime file 1945-2010 && echo "file was last modified after The War"
 file was last modified after The War


CategoryShell

پرسش و پاسخ 103 (آخرین ویرایش ‎2010-10-08 21:21:20‎ توسط pool-71-247-30-161)