احتمالاً برایتان پیش آمده است که در یک دایرکتوری، یک یا چند کپی از یک فایل داشته باشید.
اگر به هر دلیل لازم شود که این فایل هارا حذف کنید، یک راه حل نا عاقلانه این است که محتویات تک تک آنها را مشاهده کرده و در صورت نیاز حذف کنید. اما با نوشتن یک برنامه ی پوسته، قادر خواهید بود به راحتی فایل هارا حذف کنید.
برای شروع، ابتدا وارد ترمینال شوید و دستور زیر را وارد کنید تاوارد دایردکتوری دسکتاپ شوید:
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
تهیه شده توسط ۹۵۱۸۳۰۲۴۳