ค้นหาไฟล์ที่ซ้ำกัน


90

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


3
โปรดทราบว่าวิธีการใด ๆ ที่เป็นไปได้ในการทำเช่นนี้จะต้องเปรียบเทียบไฟล์ทุกไฟล์ในระบบของคุณกับไฟล์อื่น ๆ ทุกไฟล์อย่างสม่ำเสมอ ดังนั้นนี่จะใช้เวลานานแม้ว่าจะใช้ทางลัด
Shadur

4
@Shadur ถ้ามีโอเคกับ checksums มันจะเดือดร้อนกว่าการเปรียบเทียบเพียงแฮช - ซึ่งในระบบส่วนใหญ่มีลำดับ 10 ^ (5 + -1) โดยปกติ <รายการ 64- ​​ไบต์ แน่นอนคุณต้องอ่านข้อมูลอย่างน้อยหนึ่งครั้ง :)
peterph

15
@Shadur นั่นไม่จริง คุณสามารถลดเวลาโดยการตรวจสอบสำหรับการจับคู่st_sizes กำจัดผู้ที่มีเพียงหนึ่งในเดียวกันและหลังจากนั้นเพียงการคำนวณ md5sums สำหรับการจับคู่st_sizes
Chris Down

6
@Shadur แม้แต่วิธีที่โง่อย่างไม่น่าเชื่อที่ไม่อนุญาตให้ดำเนินการแฮชสามารถทำได้ใน in (n log n) เปรียบเทียบ - ไม่ใช่Θ (n²) - ใช้อัลกอริทึมการเรียงลำดับใด ๆ (ตามเนื้อหาไฟล์)
Derobert

1
@ChrisDown ใช่การจับคู่ขนาดจะเป็นหนึ่งในทางลัดที่ฉันมีอยู่ในใจ
Shadur

คำตอบ:


104

fdupesสามารถทำได้ จากman fdupes:

ค้นหาเส้นทางที่กำหนดสำหรับไฟล์ที่ซ้ำกัน ไฟล์ดังกล่าวพบได้โดยการเปรียบเทียบขนาดไฟล์และลายเซ็น MD5 ตามด้วยการเปรียบเทียบไบต์ต่อไบต์

ใน Debian apt-get install fdupesหรืออูบุนตูคุณสามารถติดตั้งด้วย ใน Fedora / Red Hat / CentOS yum install fdupesคุณสามารถติดตั้งด้วย เมื่อวันที่ Arch Linux คุณสามารถใช้pacman -S fdupesและ emerge fdupesGentoo,

ในการรันการตรวจสอบจากมากไปน้อยจากรูทของระบบไฟล์ซึ่งอาจต้องใช้เวลาและหน่วยความจำนานพอfdupes -r /สมควร

ตามที่ถามในความคิดเห็นคุณสามารถได้รับสำเนาที่ใหญ่ที่สุดโดยทำดังต่อไปนี้:

fdupes -r . | {
    while IFS= read -r file; do
        [[ $file ]] && du "$file"
    done
} | sort -n

สิ่งนี้จะพังถ้าชื่อไฟล์ของคุณมีการขึ้นบรรทัดใหม่


ขอบคุณ ฉันจะกรอง dupe ที่ใหญ่ที่สุดได้อย่างไร ฉันจะทำให้ขนาดมนุษย์อ่านได้อย่างไร
นักเรียน

@ นักเรียน: ใช้บางสิ่งบางอย่างตามสายของ (ให้แน่ใจว่า fdupes เพียงแค่ส่งชื่อไฟล์โดยไม่ต้องมีข้อมูลเพิ่มเติมหรือตัดหรือยั่วเพียงเพื่อรักษาไว้): fdupes ....... | xargs ls -alhd | egrep 'M |G 'เพื่อเก็บไฟล์ในรูปแบบที่มนุษย์สามารถอ่านได้และมีขนาดเป็นเมกะไบต์ เปลี่ยนคำสั่งเพื่อให้เหมาะกับเอาต์พุตจริง
Olivier Dulac

2
@OlivierDulac คุณไม่ควรแยก LS โดยปกติแล้วจะแย่กว่ากรณีที่ใช้งานของคุณ แต่ถึงแม้จะอยู่ในกรณีที่ใช้งานของคุณ
Chris Down

@student - เมื่อคุณมีชื่อไฟล์แล้วduระบบsortจะบอกให้คุณทราบ
Chris Down

@ChrisDown: มันเป็นความจริงมันเป็นนิสัยที่ไม่ดีและสามารถให้ผลบวกได้ แต่ในกรณีนั้น (ใช้แบบอินเทอร์แอคทีฟและเพื่อแสดงเท่านั้นไม่มี "rm" หรือการเรียงลำดับใด ๆ อาศัยโดยตรง) มันก็ดีและรวดเร็ว ^^ ฉันรักหน้าเว็บที่คุณเชื่อมโยงไปถึง btw (อ่านมาตั้งแต่สองสามเดือนและเต็มไปด้วยข้อมูลที่เป็นประโยชน์มากมาย)
Olivier Dulac

26

เครื่องมือที่ดีอีกอย่างคือfslint:

fslint เป็นชุดเครื่องมือในการค้นหาปัญหาต่างๆเกี่ยวกับระบบไฟล์รวมถึงไฟล์ที่ซ้ำกันและชื่อไฟล์ที่มีปัญหา ฯลฯ

เครื่องมือบรรทัดคำสั่งแต่ละรายการมีให้ใช้เพิ่มเติมนอกเหนือจาก GUI และเพื่อเข้าถึงเครื่องมือเหล่านี้สามารถเปลี่ยนหรือเพิ่มลงในไดเร็กทอรี $ PATH ได้ที่ไดเร็กทอรี / usr / share / fslint / fslint บนการติดตั้งมาตรฐาน แต่ละคำสั่งเหล่านี้ในไดเรกทอรีนั้นมีตัวเลือก - ช่วยซึ่งให้รายละเอียดพารามิเตอร์เพิ่มเติม

   findup - find DUPlicate files

บนระบบที่ใช้เดเบียนคุณสามารถติดตั้งได้ด้วย:

sudo apt-get install fslint

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

find / -type f -exec md5sum {} \; > md5sums
gawk '{print $1}' md5sums | sort | uniq -d > dupes
while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes 

ตัวอย่างเอาต์พุต (ชื่อไฟล์ในตัวอย่างนี้เหมือนกัน แต่จะทำงานเมื่อแตกต่างกัน):

$ while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes 
---
 /usr/src/linux-headers-3.2.0-3-common/include/linux/if_bonding.h
 /usr/src/linux-headers-3.2.0-4-common/include/linux/if_bonding.h
---
 /usr/src/linux-headers-3.2.0-3-common/include/linux/route.h
 /usr/src/linux-headers-3.2.0-4-common/include/linux/route.h
---
 /usr/src/linux-headers-3.2.0-3-common/include/drm/Kbuild
 /usr/src/linux-headers-3.2.0-4-common/include/drm/Kbuild
---

นี้จะเป็นมากช้ากว่าเครื่องมือเฉพาะที่กล่าวมาแล้ว แต่มันจะทำงาน


4
มันจะมากเร็วเพื่อหาไฟล์ใด ๆ ที่มีขนาดเดียวกับไฟล์อื่นโดยใช้st_sizeกำจัดใด ๆ ที่มีเพียงหนึ่งไฟล์ขนาดนี้แล้วคำนวณ md5sums st_sizeระหว่างไฟล์ที่มีเหมือนกัน
Chris Down

@ChrisDown ใช่เพียงแค่ต้องการทำให้มันง่าย สิ่งที่คุณแนะนำจะช่วยเร่งความเร็วของสิ่งต่าง ๆ อย่างมาก นั่นเป็นเหตุผลที่ฉันมีข้อจำกัดความรับผิดชอบเกี่ยวกับเรื่องนี้ว่าช้าในตอนท้ายของคำตอบของฉัน
terdon

8

คำตอบสั้น ๆ : ใช่

รุ่นที่ยาวกว่า: ดูที่รายการ wikipedia fdupesมันเป็นรายการที่ค่อนข้างดีของโซลูชั่นสำเร็จรูป แน่นอนคุณสามารถเขียนของคุณเองก็ไม่ได้ว่าเป็นเรื่องยาก - โปรแกรมคร่ำเครียดเหมือนdiff, sha*sum, find, sortและuniqควรทำงาน คุณสามารถใส่มันลงในหนึ่งบรรทัดและมันจะยังคงเป็นที่เข้าใจได้


6

หากคุณเชื่อว่าฟังก์ชันแฮช (ที่นี่ MD5) ไม่มีการชนกันบนโดเมนของคุณ:

find $target -type f -exec md5sum '{}' + | sort | uniq --all-repeated --check-chars=32 \
 | cut --characters=35-

ต้องการชื่อไฟล์ที่เหมือนกันหรือไม่ เขียนสคริปต์อย่างง่ายnot_uniq.shเพื่อจัดรูปแบบผลลัพธ์:

#!/bin/bash

last_checksum=0
while read line; do
    checksum=${line:0:32}
    filename=${line:34}
    if [ $checksum == $last_checksum ]; then
        if [ ${last_filename:-0} != '0' ]; then
            echo $last_filename
            unset last_filename
        fi
        echo $filename
    else
        if [ ${last_filename:-0} == '0' ]; then
            echo "======="
        fi
        last_filename=$filename
    fi

    last_checksum=$checksum
done

จากนั้นเปลี่ยนfindคำสั่งเพื่อใช้สคริปต์ของคุณ:

chmod +x not_uniq.sh
find $target -type f -exec md5sum '{}' + | sort | not_uniq.sh

นี่เป็นแนวคิดพื้นฐาน อาจเป็นไปได้ว่าคุณควรเปลี่ยนแปลงfindหากชื่อไฟล์ของคุณมีอักขระบางตัว (เช่นพื้นที่)


6

ฉันคิดว่าจะเพิ่ม fdupes, jdupes ที่ได้รับการปรับปรุงซึ่งสัญญาว่าจะเร็วขึ้นและฟีเจอร์ที่หลากหลายกว่า fdupes (เช่นตัวกรองขนาด):

jdupes . -rS -X size-:50m > myjdups.txt

สิ่งนี้จะค้นหาไฟล์ซ้ำที่มีขนาดใหญ่กว่า 50MB ซ้ำในไดเรกทอรีปัจจุบันและส่งออกรายการผลลัพธ์ใน myjdups.txt

หมายเหตุผลลัพธ์ไม่ได้เรียงตามขนาดและเนื่องจากดูเหมือนว่าจะไม่สร้างฉันได้ปรับ @Chris_Down คำตอบด้านบนเพื่อให้ได้สิ่งนี้:

jdupes -r . -X size-:50m | {
    while IFS= read -r file; do
        [[ $file ]] && du "$file"
    done
} | sort -n > myjdups_sorted.txt

หมายเหตุ: jdupes เวอร์ชันล่าสุดรองรับไฟล์ที่ตรงกันที่มีแฮชเพียงบางส่วนแทนที่จะรอแฮชทั้งหมด มีประโยชน์มาก. (คุณต้องโคลนที่เก็บถาวรคอมไพล์เพื่อให้ได้) นี่คือตัวเลือกที่ฉันใช้อยู่ตอนนี้: jdupes -r -T -T --exclude = size-: 50m
Benjamin

2

วิกิพีเดียมีบทความ ( http://en.wikipedia.org/wiki/List_of_duplicate_file_finders ) โดยมีรายชื่อของซอฟต์แวร์โอเพนซอร์สที่พร้อมใช้งานสำหรับงานนี้ แต่มันถูกลบแล้ว

ฉันจะเพิ่มว่า fslint เวอร์ชัน GUI นั้นน่าสนใจมากทำให้สามารถใช้หน้ากากเพื่อเลือกไฟล์ที่จะลบ มีประโยชน์มากในการทำความสะอาดภาพถ่ายซ้ำ

บน Linux คุณสามารถใช้:

- FSLint: http://www.pixelbeat.org/fslint/

- FDupes: https://en.wikipedia.org/wiki/Fdupes

- DupeGuru: https://www.hardcoded.net/dupeguru/

2 ทำงานล่าสุดในหลาย ๆ ระบบ (windows, mac และ linux) ฉันไม่ได้ตรวจสอบ FSLint


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

2
หน้า Wikipedia ว่างเปล่า
ihor_dvoretskyi

ใช่มันได้รับการทำความสะอาดแล้วช่างน่าสงสาร ...
MordicusEtCubitus

ฉันได้แก้ไขด้วยเครื่องมือ 3 ตัวนี้
MordicusEtCubitus

0

นี่คือของฉันที่:

find -type f -size +3M -print0 | while IFS= read -r -d '' i; do
  echo -n '.'
  if grep -q "$i" md5-partial.txt; then echo -e "\n$i  ---- Already counted, skipping."; continue; fi
  MD5=`dd bs=1M count=1 if="$i" status=noxfer | md5sum`
  MD5=`echo $MD5 | cut -d' ' -f1`
  if grep "$MD5" md5-partial.txt; then echo "\n$i  ----   Possible duplicate"; fi
  echo $MD5 $i >> md5-partial.txt
done

ต่างกันตรงที่มันจะแฮชไฟล์ได้ไม่เกิน 1 MB แรก
ปัญหานี้มีปัญหา / คุณสมบัติไม่กี่:

  • อาจมีความแตกต่างหลังจาก 1 MB แรกดังนั้นผลลัพธ์จึงเป็นตัวเลือกที่จะตรวจสอบ ฉันอาจแก้ไขได้ในภายหลัง
  • การตรวจสอบตามขนาดไฟล์ก่อนสามารถเพิ่มความเร็วได้
  • ใช้ไฟล์ที่มีขนาดใหญ่กว่า 3 MB เท่านั้น

ฉันใช้มันเพื่อเปรียบเทียบวิดีโอคลิปดังนั้นนี่ก็เพียงพอแล้วสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.