NAVAB.ORG NAVAB.ORG
تماس معرفي علمي/فني گوارا خانه
لينكها
گوارا

خونه علی آقا روی Net
کوچه ی بی دار و درخت
تجربيات يک ايرانی شاغل در Microsoft
خورشيد خانوم
شكّر
جف
قصه های عامه پسند
راهي
خاطرات يك افسر وظيفه
سه نقطه ستان
زهرا
فیلم / سینما

سايت های پر کاربرد
موسيقي
ترانه های فارسی موسيقی ايرانی
----
يه سايت خوب برای گوش دادن به آهنگ هاي قديمي *جديد
----
جدید ترین آهنگهای ایرانی وخارجی ودرخواستی شما
----
يک سايت خوب برای گرفتن آهنگ های ترکی و غير ترکی
----
يه سايت خوب برای Download آهنگ های جديد ايرانی
----
‏ToolBox
بهترين سايت برای ارسال کارت تبريک
----
بانک اطلاعات رستورانهای ايران
----
سايت 118
----
جستجوی پزشک
----
Online Dictionary فارسی به انگليسی و انگليسی به فارسی
----
برنامه سينماهاي تهران
----
راهنماي اخذ پذيرش از دانشگاه هاي معتبر دنيا

Photography

Digital Camera Reviews And News
----
A Digital Photography Contest
----
photoSIG
----
Learning about the world through photography
----
Digital Photography - Cameras Buying & Comparing Guide
----
Persia at Photo

چوق الف

آرشيو مطالب قبل
March 2005
April 2005
May 2005
July 2005
August 2005
September 2005
October 2005
November 2005
December 2005
January 2006
February 2006
July 2006
August 2006
February 2007
April 2007
May 2007
September 2007

Thursday, February 02, 2006
حذف فایلهای قدیمی در یونیکس!
خوب امروز بریم یه کمی یونیکس بازی کنیم...
یونیکس کارا میدونن که ابزار Perl یکی از مهم ترین ابزارهای مدیریتی و برنامه نویسی در یونیکسه!!
بعضیا ممکنه بگن چرا مدیریتی!؟!! مگه Perl زبان برنامه نویسی نیست؟.. باید بگم چرا همین طوره ... این یکی از زبانهای اسکریپت نویسی در محیط یونیکسه اما کاربرد زیادی در مدیریت سیستمهای یونیکس داره... همونطور که اگه یه نفر مدیر شبکه میتنی بر ویندوز اگه بلد باشه اسکریپتهای مدیریتی ویندوز رو بنویسه خیلی از کاراش آسون تر میشه...
خوب ممکنه کسی بخواد Perl رو توی محیط ویندوز استفاده کنه، خوب باید بگم این کار هم شدنیه و بسته های برنامه نویسی زیادی تحت ویندوز براش وجود داره... ولی روی ویندوز این ابزار بیشتر جنبه برنامه نویسی پیدا میکنه و از همه مهم تر خیلی از کارهایی که انجامش به محیط عامل بر میگرده غیر فعال میشه به خاطر همیین معمولا سازگاری نرم افزارهای نوشته شده با این زبان بین یونیکس و ویندوز گاهی مشکل میشه... البته غیر ممکن نیست. ولی نرم افزار نوشته شده با این زبان بین دو ماشین یونیکس بدون هیچ مشکلی قابل انتقاله.

بعد از این مقدمه میخوام راجع به یه تابع جالب از Perl بنویسم که کاربردش رو با یک مثال خواهم آورد.

تابع stat(filename) کارش اینه که وضعیت یک فایل رو به صورت یک آرایه سیزده عنصری بر میگردونه به این جدول نگاه کنید:



0) dev= device number of filesystem
1) ino= inode number
2) mode= file mode (type and permissions)
3) nlink= number of (hard) links to the file
4) uid= numeric user ID of file's owner
5) gid= numeric group ID of file's owner
6) rdev= the device identifier (special files only)
7) size= total size of file, in bytes
8) atime= last access time in seconds since the epoch
9) mtime= last modify time in seconds since the epoch
10) ctime= inode change time in seconds since the epoch
11) blksize= preferred block size for file system I/O
12) blocks= actual number of blocks allocated


خوب برای خوندن این 13 عنصر طبق دستور زبان Perl به این روشها میشه کار کرد:


1) برای خوندن کل آرایه:

@items = stat("/home/userA/test.txt");

2) برای مقدار دهی چندین متغیر به صورت همزمان و بدون استفاده از آرایه:

($dev,$ino,$mode,$nlink,
$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,
$blksize,$blocks)
= stat("/home/userA/test.txt");


3) برای دسترسی به فقط یک یا چند عنصر به صورت مجزا:

$mode = (stat("/home/userA/test.txt"))[2];
$mtime = (stat("/home/userA/test.txt"))[9];

برای کاری که ما میخواهیم انجام بدیم چیزی که مهمه آخرین تاریخ تغییر فایله. در Perl تاریخ به صورت تعداد ثانیه ها بر حسب مبدا تاریخ Thu Jan 1 03:30:00 1970 سنجیده میشه.. خوب تاریخ هم که به عقب بر نمیگرده...

یه تابع دیگه هم نیاز داریم اونهم تابعیه که زمان جاری رو بهمون بده.. قابل حدثه مگه نه؟... تابع time() خوب حالا ببینیم چی میتونیم بسازیم:

$filemaxage = 10 * 24 * 3600;
$filename = '/home/userA/test.txt';
$mtime = (stat($filename))[9];
if ( (time() - $mtime) > $filemaxage){
         unlink($filename);
}

تابع unlink() فایل رو حذف میکنه. و $filemaxage ماکزیمم طول عمر فایل بر حسب ثانیه هستش که اینجا برای 10 روز محاسبه شده. بنا بر این، برنامه ما اگه فایل قدیمی تر از 10 روز باشه پاکش میکنه.


خوب فکر میکنم این اسکریپت به اندازه کافی واضح باشه.. بریم کاملش کنیم... حالا میخوایم آدرس یه دایرکتوری رو بدیم که بره توش بگرده و فایلهای قدیمی رو پاک کنه برای این کار باید فهرست دایرکتوری رو به دست بیاریم... تابع glob() این کارو انجام میده.

خوب ببینیم چه تغییری باید روی اسکریپت بدیم:

$dirpath = '/home/userA/';
$filemaxage = 10 * 24 * 3600;
$curtime = time();
@dirlist = glob($dirpath);
foreach (@dirlist){
         $mtime = (stat($_))[9];
         if ( ($curtime - $mtime) > $filemaxage){
                  unlink($_);
         }
}

اگه دوست داشته باشید میتونین برای استفاده های بعدی برنامه ای رو که نوشتین به صورتی در بیارین که با پارامترهای سطر فرمان هم کار کنه مثلاً به این صورت:

#!/usr/local/bin/perl

if ($#ARGV != 1){
         die "usage:rmold \n";
};

$dirpath = $ARGV[0];
$filemaxage = $ARGV[1]* 86400;
$curtime = time();
@dirlist = glob "$dirpath/*";
foreach (@dirlist){
         $mtime = (stat($_))[10];
         if (($curtime - $mtime)> $filemaxage){
                  unlink $_;
         }
}




ممکنه کسی بپرسه که کاربرد این اسکریپت چی میتونه باشه؟... جوابش اینه... اگه شما بخواهید که فایلهای قدیمیSESSION رو که مثلاً توسط PHP ایجاد شده پاک کنین میتونین با استفاده از این اسکریپت و سرویس cron این کار رو هر چند لحظه یک بار انجام بدین...


من خودم این اسکریپت رو برای این نوشتم که ایمیلهائی رو که به عنوان اسپم شناسائی شدن و در دایرکتوری SPAM روی Mail Server قرار گرفتن، در صورتی که مدت معینی از عمرشون گذشته باشه به صورت خودکار پاک بشن.

ضمناً برای اونهائی که میخوان این کد رو تست کنن باید بگم من اونو روی FreeBSD 5.2.1 و Perl v5.8.5 تست کردم...

امیدوارم این مطلب به دردتون خورده باشه...


مرجع:

[1] Perl 5.8.7 documentation
http://perldoc.perl.org/functions/stat.html

 

اين Post را Elvis Moris در زمان 5:27 AM ارسال كرده

نظرات ديگران

Anonymous نوشته

Salam pedaram,
kheily bahal bood. arezooye movafaghiat va payandegi

pesare shoma,
S.
12:00 PM  

Anonymous نوشته

Alo, ba ki kar darin shoma? eshteba gerefTn,bale
shomare hamine,.....
8:07 PM  

Elvis Moris نوشته

مرسی پسرم... قابلی نداشت...
6:05 AM  

Anonymous نوشته

Pedaram pas chera update nemikonid? man har rooz miam sar vazanm , vali hichi update nashode.
2:27 AM  

مریم نوشته

Yeki be manam bege inja che khabare?!!!
7:56 AM  

Elvis Moris نوشته

پسرم درسها دوباره شروع شدن و مجالی نیست... در اولین فرصت باز هم مطلب مینویسم ... خوش باشی پسرم...
5:55 AM  

Anonymous نوشته

Salam e mojadad pedaram,
ajib hal mikonam ba in weblog. lotfan bishtar update konid,
iee Linux ke gofty yani che?
nakone Linux esme khanoome??? haaaaa

pesaretoon
4:33 AM  

نظر دهيد وب سايت علمی/فنی

This page is powered by Blogger. Isn't yours?
©تمامي حقوق اين سايت براي مولف محفوظ مي باشد