เป็นไปได้หรือไม่ที่จะค้นหาไฟล์ที่ซ้ำกันในดิสก์ของฉันซึ่งมีบิตเป็นบิตเหมือนกัน แต่มีชื่อไฟล์ต่างกัน?
st_size
s กำจัดผู้ที่มีเพียงหนึ่งในเดียวกันและหลังจากนั้นเพียงการคำนวณ md5sums สำหรับการจับคู่st_size
s
เป็นไปได้หรือไม่ที่จะค้นหาไฟล์ที่ซ้ำกันในดิสก์ของฉันซึ่งมีบิตเป็นบิตเหมือนกัน แต่มีชื่อไฟล์ต่างกัน?
st_size
s กำจัดผู้ที่มีเพียงหนึ่งในเดียวกันและหลังจากนั้นเพียงการคำนวณ md5sums สำหรับการจับคู่st_size
s
คำตอบ:
fdupes
สามารถทำได้ จากman fdupes
:
ค้นหาเส้นทางที่กำหนดสำหรับไฟล์ที่ซ้ำกัน ไฟล์ดังกล่าวพบได้โดยการเปรียบเทียบขนาดไฟล์และลายเซ็น MD5 ตามด้วยการเปรียบเทียบไบต์ต่อไบต์
ใน Debian apt-get install fdupes
หรืออูบุนตูคุณสามารถติดตั้งด้วย ใน Fedora / Red Hat / CentOS yum install fdupes
คุณสามารถติดตั้งด้วย เมื่อวันที่ Arch Linux คุณสามารถใช้pacman -S fdupes
และ emerge fdupes
Gentoo,
ในการรันการตรวจสอบจากมากไปน้อยจากรูทของระบบไฟล์ซึ่งอาจต้องใช้เวลาและหน่วยความจำนานพอfdupes -r /
สมควร
ตามที่ถามในความคิดเห็นคุณสามารถได้รับสำเนาที่ใหญ่ที่สุดโดยทำดังต่อไปนี้:
fdupes -r . | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n
สิ่งนี้จะพังถ้าชื่อไฟล์ของคุณมีการขึ้นบรรทัดใหม่
fdupes ....... | xargs ls -alhd | egrep 'M |G '
เพื่อเก็บไฟล์ในรูปแบบที่มนุษย์สามารถอ่านได้และมีขนาดเป็นเมกะไบต์ เปลี่ยนคำสั่งเพื่อให้เหมาะกับเอาต์พุตจริง
du
ระบบsort
จะบอกให้คุณทราบ
เครื่องมือที่ดีอีกอย่างคือ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
---
นี้จะเป็นมากช้ากว่าเครื่องมือเฉพาะที่กล่าวมาแล้ว แต่มันจะทำงาน
st_size
กำจัดใด ๆ ที่มีเพียงหนึ่งไฟล์ขนาดนี้แล้วคำนวณ md5sums st_size
ระหว่างไฟล์ที่มีเหมือนกัน
คำตอบสั้น ๆ : ใช่
รุ่นที่ยาวกว่า: ดูที่รายการ wikipedia fdupesมันเป็นรายการที่ค่อนข้างดีของโซลูชั่นสำเร็จรูป แน่นอนคุณสามารถเขียนของคุณเองก็ไม่ได้ว่าเป็นเรื่องยาก - โปรแกรมคร่ำเครียดเหมือนdiff
, sha*sum
, find
, sort
และuniq
ควรทำงาน คุณสามารถใส่มันลงในหนึ่งบรรทัดและมันจะยังคงเป็นที่เข้าใจได้
หากคุณเชื่อว่าฟังก์ชันแฮช (ที่นี่ 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
หากชื่อไฟล์ของคุณมีอักขระบางตัว (เช่นพื้นที่)
ฉันคิดว่าจะเพิ่ม 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
วิกิพีเดียมีบทความ ( 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
นี่คือของฉันที่:
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 แรก
ปัญหานี้มีปัญหา / คุณสมบัติไม่กี่:
ฉันใช้มันเพื่อเปรียบเทียบวิดีโอคลิปดังนั้นนี่ก็เพียงพอแล้วสำหรับฉัน