Deadmarshal

لینوکس و برنامه نویسی

Deadmarshal

لینوکس و برنامه نویسی

یافتن فایل های تکراری در پایتون

يكشنبه, ۲۹ بهمن ۱۳۹۶، ۰۲:۱۶ ب.ظ

گاهی اوقات باید فایل های تکراری در فایل سیستمی، یا یک پوشه ای را پیدا کنیم. در این آموزش می خواهیم اسکریپت پایتونی به این منظور بنویسیم. این کد با پایتون نسخه 3 (و به بالا) کار می کند.

برنامه یک پوشه یا چندین پوشه را برای بررسی دریافت می کند، بعد داخل مسیرهای داده شده رفته و فایل ها یا پوشه های تکراری را پیدا خواهد کرد.

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

{ hash: [list of paths] }

برای شروع کتابخانه های sys، os و hashlib را وارد کنید:

pyduplicate1

بعد به یک تابع برای محاسبه MD5 hash فایل نیاز داریم. این تابع مسیر فایل را دریافت و خلاصه HEX فایل را بر می گرداند:

حال به یک تابع برای بررسی مسیر فایل های تکراری نیاز داریم:

تابع findDup از os.walk برای پیمودن مسیر استفاده می شود. اگر توضیحات بیشتری درباره این تابع می خواهید، یک نگاهی به مقاله "چطور در مسیر درختی توسط پایتون پیمایش کنیم" بیاندازید. تابع os.walk فقط نام فایل را بر می گرداند، پس از os.path.join برای گرفتن مسیر کامل فایل استفاده می کنیم. بعد hash فایل را گرفته و در دیکشنری dups ذخیره می نماییم.

وقتی پیمودن مسیر ها توسط findDup تمام شد، یک دیکشنری با فایل های تکراری بر می گرداند. اگر می خواهیم مسیر را بپیماییم، به روشی برای مخطور کردن دو دیکشنری نیاز داریم:

joinDicts دو دیکشنری را می پذیرد، در دیکشنری دوم می پیماید و چک می کند که آیا کلید در دیکشنری اول وجود دارد یا خیر، اگر وجود داشت، دو ارزش را در دیکشنری دوم با آنهایی که در دیکشنری اول بودند ادغام می کند. اگر کلید وجود نداشت، در دیکشنری اول آن را ذخیره می نماید. در آخر کار، دیکشنری اول حاوی تمام اطلاعات است.

برای اینکه بتوانیم اسکریپت را از خط فرمان اجرا کنیم، باید پوشه ها را به عنوان پارامتر دریافت کنیم، و بعد findDup را برای هر پوشه صدا بزنیم:

تابع os.path.exists مطمئن می شود که پوشه داده شده در فایل های سیستم وجود دارد. برای اجرای این اسکریپت از 

dupFinder.py /folder1 ./folder2

استفاده کنید. و در آخر به متد (method) برای چاپ نتایج نیاز داریم:

کد تکمیل شده:

منبع: لینک

موافقین ۰ مخالفین ۰ ۹۶/۱۱/۲۹
Ali M

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی