การค้นหาและลบไฟล์ซ้ำ

Kritchai Tadbhusinwat
G-Able
Published in
3 min readDec 27, 2023
Image by Author (generated by AI)

ในกระบวนการการวิเคราะห์ข้อมูลนั้น การจะไปให้ถึงปลายทางว่าข้อมูลที่เรากำลังวิเคราะห์นั้นมี insight อย่างไร ล้วนเริ่มต้นจาก raw data ที่มี ซึ่งโดยส่วนใหญ่แล้วจะเป็นไฟล์ข้อมูล เช่น csv xls json เป็นต้น

ปัญหาหนึ่งที่พบ คือ ไฟล์ต่าง ๆ อาจจะมีการซ้ำกัน คือ เป็นไฟล์เดียวกันแต่ชื่อไม่เหมือนกัน หากนำไฟล์ไปใช้จะทำให้เกิดการซ้ำซ้อนของข้อมูลและจะต้องเสียทรัพยากรในการประมวลผลข้อมูลซ้ำ ๆ

ดังนั้น ก่อนนำข้อมูลไปใช้งานจึงควรคัดกรองเลือกเอาเฉพาะไฟล์ที่ไม่ซ้ำเท่านั้นไปใช้ โดยทั่วไปแล้วหากจำนวนไฟล์มีไม่มากก็พอที่จะทำการเปิดไฟล์เข้าไปดูเนื้อหาของแต่ไฟล์แล้วเปรียบเทียบด้วยการดูรายละเอียดของแต่ละไฟล์นั้นว่าเหมือนกันหรือไม่ แต่หากว่าไฟล์มีเป็นจำนวนมากหรือรายละเอียดในไฟล์แตกต่างกันเพียงเล็กน้อยก็อาจจะเกิดข้อผิดพลาดได้

เพื่อความสะดวกจะทำการเขียนโปรแกรมเพื่อทำการค้นหาไฟล์ที่ซ้ำและทำการลบไฟล์ซ้ำนั้นทิ้งไป
การจะระบุว่าแต่ละไฟล์นั้นซ้ำกันหรือไม่ จะใช้การหาค่า hash ของแต่ละไฟล์ ในที่นี้เลือกใช้ md5 (เพราะว่าทำงานเร็วไม่ซับซ้อนและต้องการแค่ค่า hash เท่านั้น)

จากนั้นจะทำการจัดแบ่งรายชื่อไฟล์เป็น
set_1 : รายชื่อไฟล์ทั้งหมดใน folder
set_2 : รายชื่อไฟล์ที่มีค่า hash แตกต่างกัน (distinct hash) เรียกว่าเป็น master file
set_3 = set_1 — set_2 : รายชื่อไฟล์ที่ซ้ำใน folder (ไม่รวมไฟล์ที่เป็น master file)

hash หรือ message digest คือ ฟังก์ชันการเข้ารหัสทางเดียว กล่าวคือ ไม่สามารถย้อนหาต้นทางได้ว่ามาจากอะไร และ ข้อมูลต้นทางแม้แตกต่างกันเพียงเล็กน้อยก็จะได้ค่า hash ที่แตกต่างกันมากและโอกาสที่ค่า hash จะซ้ำกันนั้นน้อยมาก
hash algorithm จะมีอยู่ด้วยกันหลายตัว เช่น CRC32 , MD5 , SHA1 , SHA256 เป็นต้น (หากนำไปใช้งานด้าน security แนะนำให้ใช้ SHA256)

เพื่อให้เห็นภาพการทำงานของโปรแกรมในที่นี้จะใช้ module pandas เพื่อเก็บข้อมูลการทำงานของโปรแกรมใน dataframe

ตัวอย่าง หากมีไฟล์ข้อมูล 17 ไฟล์ ดังรูป

Image by Author

โดยในตัวอย่างนี้ ไฟล์ที่ขึ้นต้นด้วยตัวอักษรเดียวกัน คือ ไฟล์ที่ซ้ำกัน เขียนโปรแกรมได้ดังนี้

ที่บรรทัด 24 จะได้ dataframe df1 ที่เก็บรายชื่อไฟล์ทั้งหมดใน folder

Image by Author

ที่บรรทัด 27 จะได้ dataframe df1 ที่คำนวณค่า md5

Image by Author

ที่บรรทัด 30 จะทำการสร้าง dataframe df2 ที่เลือกเฉพาะค่า md5 ที่แตกต่างกัน (master file)

Image by Author

ที่บรรทัด 33 จะทำการสร้าง dataframe df3 ที่เลือกเฉพาะรายชื่อไฟล์ที่ซ้ำกัน (ไม่รวม master file) โดยใช้หลักการ ลบ กันของ set

Image by Author

บรรทัดที่ 36–38 จะเป็นการลบไฟล์ที่ ซ้ำกันทิ้งไป จะได้ผลลัพธ์ เหลืออยู่ 10 ไฟล์ที่ไม่ซ้ำกัน

Image by Author

จากโปรแกรมด้านบน เราสามารถที่จะทำการลบไฟล์ที่ซ้ำกันได้แล้ว แต่ ข้อเสียคือ จะต้องทำการหาค่า md5 ของทุกไฟล์ใน folder
หากไฟล์ที่ทำการหาค่า md5 มีขนาดใหญ่ จะใช้เวลาในการคำนวณนาน
ดังนั้น จะทำการปรับปรุงประสิทธิภาพของโปรแกรม

โดยจัดแบ่งรายชื่อไฟล์เป็น
set_1 : 1.1 รายชื่อไฟล์ทั้งหมดใน folder , 1.2 ทำการหาขนาดของแต่ละไฟล์
set_2 : จาก set_1 : 2.1 ทำการเลือกรายชื่อไฟล์ที่มีขนาดไฟล์ซ้ำกัน(ไฟล์ที่ซ้ำกันจะมีขนาดเท่ากัน แต่ไม่จำเป็นต้องเป็นไฟล์เดียวกัน) , 2.2 ทำการคำนวณค่า md5 เฉพาะข้อมูลช่วงต้น ๆ ของไฟล์ กำหนดไว้เท่ากับ 1024 byte แรก เรียกว่า small_md5
set_3 : จาก set_2 : 3.1 ทำการเลือกรายชื่อไฟล์เฉพาะที่ small_md5 เหมือนกัน , 3.2 ทำการคำนวณค่า full_md5 ของไฟล์ตามรายชื่อ
set_4 : จาก set_3 ทำการเลือกรายชื่อไฟล์เฉพาะที่ค่า full_md5 เหมือนกัน จะได้รายชื่อไฟล์ที่ซ้ำกัน
set_5 : จาก set_4 ทำการเลือกรายชื่อไฟล์เฉพาะที่ full_md5 แตกต่าง (distinct hash) เรียกว่าเป็น master file
set_6 : = set_4 — set_5 : รายชื่อไฟล์ที่ซ้ำใน folder (ไม่รวมไฟล์ที่เป็น master file)

ตัวอย่างการทำงานของโปรแกรม โดยที่มีไฟล์ต่าง ๆ เหมือนกับตัวอย่างแรก โดยที่
- ไฟล์ d1.txt , e1.txt มีขนาดเท่ากัน และต้น ๆ ไฟล์ เหมือนกัน ต่างกันที่ท้ายไฟล์
- ไฟล์ชื่อขึ้นต้นด้วย a , y , z เป็นไฟล์ที่มีขนาดเท่ากัน

ที่บรรทัด 37 จะได้ dataframe df1 ที่เก็บรายชื่อไฟล์ทั้งหมดใน folder และ ขนาดของไฟล์

Image by Author

ที่บรรทัด 40 , 43 จะได้ dataframe df2 เก็บรายชื่อไฟล์ที่มีขนาดซ้ำกัน และ คำนวณค่า small_md5 ตามลำดับ

Image by Author

จะเห็นว่า ไฟล์ c1.txt นั้น ถูกละไป เนื่องจากขนาดไฟล์ไม่พบว่ามีซ้ำกับไฟล์อื่น ๆ

ที่บรรทัด 46 , 49 จะได้ dataframe df3 เก็บรายชื่อไฟล์ที่มี small_md5 ซ้ำกัน และ คำนวณค่า full_md5 ตามลำดับ

Image by Author

จะเห็นว่า ไฟล์ y1.txt นั้น ถูกละไป เนื่องจาก small_md5 ไม่พบว่าซ้ำกับไฟล์อื่น ๆ

ที่บรรทัด 52 จะได้ dataframe df4 เก็บรายชื่อไฟล์ที่ full_md5 ซ้ำกัน

Image by Author

จะเห็นว่า ไฟล์ d1.txt , e1.txt นั้น ถูกละไป เนื่องจาก full_md5 ไม่พบว่าซ้ำกับไฟล์อื่น ๆ

ที่บรรทัด 55 จะได้ dataframe df5 เก็บรายชื่อไฟล์ที่ full_md5 แตกต่างกัน (master file)

Image by Author

ที่บรรทัด 58 จะได้ dataframe df6 รายชื่อไฟล์ที่ซ้ำใน folder (ไม่รวมไฟล์ที่เป็น master) โดยใช้หลักการ ลบ กันของ set

Image by Author

ที่บรรทัด 61–63 จะเป็นการลบไฟล์ที่ซ้ำกันทิ้งไป จะได้ผลลัพธ์

Image by Author

ผลลัพธ์เหลือ 10 ไฟล์ที่ไม่ซ้ำกัน เช่นเดียวกับโปรแกรมแรก

จากตัวอย่างโปรแกรมด้านบน เป็นเพียงเทคนิคหนึ่งในการค้นหาและลบไฟล์ที่ซ้ำ นอกจากนี้ยังมีวิธีการอื่น ๆ อีก เช่น ใช้โปรแกรมสำเร็จรูป , เขียน script power shell เป็นต้น ทั้งนี้ เทคนิคต่าง ๆ ก็ขึ้นอยู่กับความเหมาะสมของลักษณะหน้างานนั้น ๆ ว่าวิธีใดจะเหมาะสมที่สุด

--

--

Kritchai Tadbhusinwat
G-Able
Writer for

Programmer บริษัทเอกชนที่เป็นส่วนหนึ่งของเบื้องหลังให้กับบริษัทชั้นนำต่าง ๆ และ Tutor สอนกวดวิชาคณิตศาสตร์/ฟิสิกส์ เพื่อเตรียมสอบเข้ามหาวิทยาลัย