برنامه نویسی

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

مورد نیاز پروژه

در دایرکتوری داده شده ، اگر پرونده هایی را بیش از اندازه معین پیدا کردید: 20MB یا پرونده های قدیمی تر از روزهای داده شده گذشته: 10 روز

آن پرونده ها را فشرده کرده و در یک پوشه “بایگانی” حرکت کنید.

1. چرا ما این فیلمنامه را می سازیم؟

  • ما در حال ایجاد این اسکریپت Bash هستیم تا روند مدیریت پرونده های بزرگ و قدیمی را در یک فهرست داده شده به صورت خودکار انجام دهیم.
  • با گذشت زمان ، دایرکتوری ها پرونده های بزرگ و منسوخ را جمع می کنند و فضای دیسک غیر ضروری را مصرف می کنند. شناسایی دستی و بایگانی این پرونده ها وقت گیر و ناکارآمد است.
  • این اسکریپت با یافتن پرونده ها بر اساس اندازه و سن ، فشرده سازی آنها و انتقال آنها به یک پوشه بایگانی برای مدیریت بهتر ، به اتوماسیون فرایند کمک می کند.

2. هدف از فیلمنامه

هدف از این اسکریپت بهبود مدیریت فضای دیسک و عملکرد سیستم توسط:

  • شناسایی پرونده های بزرگ بیش از اندازه خاص (به عنوان مثال ، 20MB)
  • یافتن پرونده های قدیمی که برای تعداد مشخصی از روزها اصلاح نشده اند (به عنوان مثال ، 10 روز)
  • فشرده سازی پرونده ها برای کاهش مصرف ذخیره سازی
  • انتقال پرونده های بایگانی شده به یک دایرکتوری جداگانه برای سازماندهی بهتر
  • برای جلوگیری از مداخله دستی ، به صورت خودکار پاکسازی

این اسکریپت در گردش کار DevOps برای مدیریت پرونده های ورود به سیستم ، اتوماسیون پشتیبان و نگهداری سیستم مفید است. 🚀

مراحل فیلمنامه:

  1. تعیین متغیرها
  2. بررسی اینکه آیا فهرست پایه وجود دارد
  3. پوشه “بایگانی” را اگر قبلاً موجود نیست ایجاد کنید
  4. تمام پرونده ها را با اندازه بیش از 20 مگابایت پیدا کنید یا بیش از 10 روز ذخیره شود
  5. هر پرونده را فشرده کنید و پرونده های فشرده شده را در پوشه “بایگانی” حرکت دهید

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
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

منطق این کارفرمایان را کنترل می کند

  1. یک فایل 5 مگابایتی که 12 روز از آن → ✅ بایگانی شده است (زیرا قدیمی است).
  2. یک فایل 25 مگابایتی که 3 روز از آن → ✅ بایگانی شده است (زیرا بزرگ است).
  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
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

✅ نتیجه نهایی

شرح تصویر

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا