گروه کاربران لینوکس دانشگاه شهید مدنی آذربایجان

لاگ دانشگاه آذربایجان :: Azarbaijan University Linux User Group

گروه کاربران لینوکس دانشگاه شهید مدنی آذربایجان

لاگ دانشگاه آذربایجان :: Azarbaijan University Linux User Group

پیدا کردن فایل های تکراری، و حذف آنها

احتمالاً  برایتان پیش آمده است که در یک دایرکتوری،  یک یا چند کپی از یک فایل داشته باشید.  

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

برای شروع، ابتدا وارد ترمینال شوید و دستور زیر را وارد کنید تاوارد دایردکتوری دسکتاپ شوید:

cd ~/Desktop

سپس یک فایل متنی جدید ایجاد کنید و اجازه ی ( permission )  اجرا بدهید:

touch DuplicateFileFinder

chmod 755 DuplicateFileFinder

حال کافیست با برنامه ی Gedit (یا هر برنامه ی  متنی  دلخواه دیگر  ) آن را باز کرده و شروع به نوشتن کد کنیم. برای این کار از دستور زیر استفاده کنید:

gedit DuplicateFileFinder

توجه کنید که در این مرحله اگر ترمینال را ببندید، gedit نیز بسته خواهد شد. مگر آن که فایل را دستی باز کرده باشید.

پنجره gedit باز شده و آماده کد زدن است.


شرح الگوریتم:

یک الگوریتم ساده که اگر کلی نگاه کنیم، با دو حلقه For تو در تو، محتویات فایلی را  با فایل های بعدی مقایسه میکند. در صورت یکسان بودن محتویات، فایل را کپی شناخته و از کاربر اجازه حذف می‌گیرد


در این مرحله، برنامه تعداد کل فایل های دایرکتوری را دریافت می‌کند



#! /bin/bash

cd ~/Desktop/dup 

# می توانید به دایرکتوری دلخواهی را برای جستوجو تغییر دهید


numberOfTotalFiles=0

for file in *; do

if [ -f $file ]; then

numberOfTotalFiles=$((numberOfTotalFiles+1))

fi

done



در این مرحله، که مرحله اصلی می‌باشد، طبق الگوریتم گفته شده عمل می‌کند:


# دریافت همه فایل ها یا دایرکتوری و ذخیره نام آنها در یک آرایه

files=(*) 

for i in $(seq 0 $((numberOfTotalFiles-1))); do

# بررسی این که فایل مربوطه موجود می‌باشد یا نه

if [ -f ${files[$i]} ]; then 

# ذخیره محتویات فایل اول

contentOfFirstFile="$(cat ${files[$i]})" 

for j in $(seq $((i+1)) $((numberOfTotalFiles-1))); do

if [ -f ${files[$j]} ]; then

 # ذخیره محتویات فایل دوم

contentOfSecondFile="$(cat ${files[$j]})"

# بررسی این که فایل مربوطه موجود می‌باشد یا نه

if [ "$contentOfFirstFile" = "$contentOfSecondFile" ]; then 

echo "${files[$j]} is duplicate. do you want to remove it? (y/...)"

read ans

if [ "$ans" = "y" ]; then

# حذف فایل

rm ${files[$j]} 

fi

fi

fi

done

fi

done

exit 0


در آخر با دستور زیر فایل را اجرا کنید:
./DuplicateFileFinder


تهیه شده توسط ۹۵۱۸۳۰۲۴۳

نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد