روز -02 / 100 – پرونده های قدیمی تر بایگانی

مورد نیاز پروژه
در دایرکتوری داده شده ، اگر پرونده هایی را بیش از اندازه معین پیدا کردید: 20MB یا پرونده های قدیمی تر از روزهای داده شده گذشته: 10 روز
آن پرونده ها را فشرده کرده و در یک پوشه “بایگانی” حرکت کنید.
1. چرا ما این فیلمنامه را می سازیم؟
- ما در حال ایجاد این اسکریپت Bash هستیم تا روند مدیریت پرونده های بزرگ و قدیمی را در یک فهرست داده شده به صورت خودکار انجام دهیم.
- با گذشت زمان ، دایرکتوری ها پرونده های بزرگ و منسوخ را جمع می کنند و فضای دیسک غیر ضروری را مصرف می کنند. شناسایی دستی و بایگانی این پرونده ها وقت گیر و ناکارآمد است.
- این اسکریپت با یافتن پرونده ها بر اساس اندازه و سن ، فشرده سازی آنها و انتقال آنها به یک پوشه بایگانی برای مدیریت بهتر ، به اتوماسیون فرایند کمک می کند.
2. هدف از فیلمنامه
هدف از این اسکریپت بهبود مدیریت فضای دیسک و عملکرد سیستم توسط:
- شناسایی پرونده های بزرگ بیش از اندازه خاص (به عنوان مثال ، 20MB)
- یافتن پرونده های قدیمی که برای تعداد مشخصی از روزها اصلاح نشده اند (به عنوان مثال ، 10 روز)
- فشرده سازی پرونده ها برای کاهش مصرف ذخیره سازی
- انتقال پرونده های بایگانی شده به یک دایرکتوری جداگانه برای سازماندهی بهتر
- برای جلوگیری از مداخله دستی ، به صورت خودکار پاکسازی
این اسکریپت در گردش کار DevOps برای مدیریت پرونده های ورود به سیستم ، اتوماسیون پشتیبان و نگهداری سیستم مفید است. 🚀
مراحل فیلمنامه:
- تعیین متغیرها
- بررسی اینکه آیا فهرست پایه وجود دارد
- پوشه “بایگانی” را اگر قبلاً موجود نیست ایجاد کنید
- تمام پرونده ها را با اندازه بیش از 20 مگابایت پیدا کنید یا بیش از 10 روز ذخیره شود
- هر پرونده را فشرده کنید و پرونده های فشرده شده را در پوشه “بایگانی” حرکت دهید
1. تعیین متغیرها
در ابتدای فیلمنامه ، چند متغیر کلیدی را تعریف می کنیم:
BASE=/home/paul/tutorials/find_command # The base directory to search files in
DAYS=10 # (Unused in this script but could be used for age-based filtering)
DEPTH=1 # The depth level for the find command
RUN=0 # A control flag (currently set to always archive)
پایه : دایرکتوری را که می خواهیم پرونده های بزرگ را جستجو کنیم تعریف می کند.
روزها: در این اسکریپت استفاده نشده است ، اما ممکن است برای فیلتر کردن پرونده ها بر اساس زمان اصلاح در نظر گرفته شود.
عمق: محدود می کند که دستور FIND چگونه باید در زیر مجموعه ها جستجو کند.
دویدن: این پرچم در حال حاضر روی 0 تنظیم شده است ، به این معنی که فیلمنامه همیشه منطق بایگانی را اجرا می کند.
2. بررسی کنید که آیا فهرست پایه وجود دارد
قبل از انجام هرگونه عملیات ، اسکریپت تأیید می کند که آیا فهرست هدف وجود دارد:
if [ ! -d $BASE ]
then
echo "directory does not exist: $BASE"
exit 1
fi
- اگر [ ! -d $BASE ]: بررسی می کند که آیا پایه $ دایرکتوری نیست.
- اگر دایرکتوری وجود نداشته باشد ، اسکریپت یک پیام خطا را چاپ می کند و از آن خارج می شود.
3. اگر قبلاً موجود نیست ، پوشه “بایگانی” ایجاد کنید
اگر یک پوشه بایگانی در داخل $ Base وجود نداشته باشد ، اسکریپت یکی را ایجاد می کند:
if [ ! -d $BASE/archive ]
then
mkdir $BASE/archive
fi
- Mkdir $ Base/Archive: پوشه بایگانی را برای ذخیره پرونده های فشرده ایجاد می کند.
- این تضمین می کند که پرونده ها دارای یک مکان مشخص برای ذخیره سازی هستند.
4. تمام پرونده ها را با اندازه بیش از 20 مگابایت یا بیش از 10 روز ذخیره کنید
عملکرد اصلی این اسکریپت یافتن پرونده های بزرگتر از 20 مگابایت یا پرونده های قدیمی تر از 10 روز و فشرده سازی آنها است:
for i in $(find "$BASE" -maxdepth "$DEPTH" -type f \( -size +20M -o -mtime +"$DAYS" \))
- $ BASE را پیدا کنید → شروع به جستجو از فهرست پایه می کند.
- -MaxDepth $ عمق → محدودیت های عمق جستجو را برای جلوگیری از اسکن زیر مجموعه های عمیق.
- -Type F → فقط پرونده ها (نه دایرکتوری ها) را انتخاب می کند.
- (…) → گروه هایی را برای اعمال منطق (-o) به درستی انجام می دهد.
- اندازه +20m files پرونده های بزرگتر از 20MB را پیدا می کند.
- -O (یا اپراتور) → تضمین می کند که پرونده های مطابق با هر شرایط انتخاب می شوند.
- -Mtime +”$ days” → پرونده های قدیمی تر از روزهای روز را پیدا می کند.
5. فشرده سازی و جابجایی پرونده ها
در داخل حلقه ، اسکریپت قبل از ادامه متغیر RUN را بررسی می کند:
if [ $RUN -eq 0 ]
از آنجا که Run روی 0 تنظیم شده است ، روند بایگانی را اجرا می کند:
echo "[ $(date "+%Y-%m-%d %H:%M:%S") ] archiving $i ==> $BASE/archive"
gzip $i || exit 1
mv $i.gz $BASE/archive || exit 1
- تاریخ “+٪ y-٪ m- ٪ d ٪ h: ٪ m: ٪ s”: چاپ زمان را برای اهداف ورود به سیستم چاپ می کند.
- gzip $ i || خروج 1: پرونده را با استفاده از GZIP فشرده می کند. اگر فشرده سازی از بین برود ، اسکریپت خارج می شود.
- mv $ i.gz $ پایه/بایگانی || خروج 1: پرونده فشرده شده (قالب .gz) را به فهرست بایگانی منتقل می کند.
فیلمنامه
BASE=/home/paul/tutorials/find_command
DAYS=10
DEPTH=1
RUN=0
# Check if the directory is present or not
if [ ! -d "$BASE" ]; then
echo "directory does not exist: $BASE"
exit 1
fi
# Create 'archive' folder if not present
if [ ! -d "$BASE/archive" ]; then
mkdir "$BASE/archive"
fi
# Find files that are either larger than 20MB OR older than 10 days
for i in $(find "$BASE" -maxdepth "$DEPTH" -type f \( -size +20M -o -mtime +"$DAYS" \));
do
if [ "$RUN" -eq 0 ]; then
echo "[ $(date "+%Y-%m-%d %H:%M:%S") ] archiving $i ==> $BASE/archive"
gzip "$i" || exit 1
mv "$i.gz" "$BASE/archive" || exit 1
fi
done
منطق این کارفرمایان را کنترل می کند
- یک فایل 5 مگابایتی که 12 روز از آن → ✅ بایگانی شده است (زیرا قدیمی است).
- یک فایل 25 مگابایتی که 3 روز از آن → ✅ بایگانی شده است (زیرا بزرگ است).
- یک فایل 5 مگابایتی که 3 روزه است → ❌ بایگانی نشده است (با هر شرایط مطابقت ندارد).
این را به عنوان Archive_Script.sh ذخیره کنید ، سپس مجوزها را اجرا کنید و آن را اجرا کنید:
chmod +x archive_script.sh
./archive_script.sh
📌 قبل از اجرای فیلمنامه
$ ls -lh /home/sourav3366/tutorials/find_command
-rw-r--r-- 1 sourav3366 users 25M Feb 12 test1.log
-rw-r--r-- 1 sourav3366 users 5M Feb 1 test2.log
-rw-r--r-- 1 sourav3366 users 30M Feb 15 test3.log
-rw-r--r-- 1 sourav3366 users 10M Feb 10 test4.log
خروجی اجرای اسکریپت
[ 2025-02-17 14:30:45 ] Archiving /home/sourav3366/tutorials/find_command/test1.log ==> /home/sourav3366/tutorials/find_command/archive
[ 2025-02-17 14:30:46 ] Archiving /home/sourav3366/tutorials/find_command/test2.log ==> /home/sourav3366/tutorials/find_command/archive
[ 2025-02-17 14:30:47 ] Archiving /home/sourav3366/tutorials/find_command/test3.log ==> /home/sourav3366/tutorials/find_command/archive
📂 پس از اجرای فیلمنامه
$ ls -lh /home/sourav3366/tutorials/find_command
-rw-r--r-- 1 sourav3366 users 10M Feb 10 test4.log
drwxr-xr-x 2 sourav3366 users 4K Feb 17 archive # Archive folder created
$ ls -lh /home/sourav3366/tutorials/find_command/archive
-rw-r--r-- 1 sourav3366 users 2M Feb 17 test1.log.gz
-rw-r--r-- 1 sourav3366 users 500K Feb 17 test2.log.gz
-rw-r--r-- 1 sourav3366 users 2.5M Feb 17 test3.log.gz
✅ نتیجه نهایی