डुप्लिकेट फ़ाइलें ढूँढें


90

क्या मेरी डिस्क पर डुप्लिकेट फ़ाइलों को ढूंढना संभव है जो थोड़ा समान हैं लेकिन अलग-अलग फ़ाइल-नाम हैं?


3
ध्यान दें कि यह कर के किसी भी संभावित विधि निरपवाद रूप से तुलना करने के लिए होगा हर एक फ़ाइल के लिए अपने सिस्टम पर हर एक अन्य फ़ाइल । इसलिए शॉर्टकट लेते हुए भी यह एक लंबा समय लेने वाला है।
शादुर

4
@ बहादुर यदि किसी को चेकसम के साथ ठीक है, तो यह सिर्फ हैश की तुलना करने के लिए उबलता है - जो कि अधिकांश प्रणालियों पर 10 ^ (5 + -1) के क्रम का होता है, आमतौर पर <64-बाइट प्रविष्टियां। बेशक, आपको कम से कम एक बार डेटा पढ़ना होगा। :)
पेट्रॉफ़

15
@ बहादुर यह सच नहीं है। आप मिलान करने के लिए जाँच करके समय को कम कर सकते हैं st_size, केवल उसी में से एक को समाप्त कर सकते हैं, और फिर केवल मिलान के लिए md5sums की गणना कर सकते हैं st_size
क्रिस डाउन

6
@ बहादुर भी किसी भी हैश संचालन को रोकने के लिए एक अविश्वसनीय रूप से मूर्खतापूर्ण दृष्टिकोण ur (n लॉग एन) में ऐसा कर सकता है - किसी भी प्रकार के एल्गोरिदम (फ़ाइल सामग्री के आधार पर) की तुलना किसी भी तरह से नहीं कर सकता है।
derobert

1
@ क्रिसडाउन हाँ, साइज़ मैचिंग मेरे दिमाग में आने वाले शॉर्टकट में से एक होगा।
शादुर

जवाबों:


104

fdupesयह कर सकता है। से man fdupes:

डुप्लिकेट फ़ाइलों के लिए दिए गए पथ को खोजता है। इस तरह की फाइलें फ़ाइल के आकार और एमडी 5 हस्ताक्षरों की तुलना करके पाई जाती हैं, इसके बाद बाइट की तुलना की जाती है।

डेबियन या उबंटू में, आप इसे स्थापित कर सकते हैं apt-get install fdupes। फेडोरा / रेड हैट / सेंटोस में, आप इसे स्थापित कर सकते हैं yum install fdupes। आर्क लिनक्स पर आप pacman -S fdupesऔर जेंटू पर, का उपयोग कर सकते हैं emerge fdupes

अपने फाइलसिस्टम रूट से उतरने वाले चेक को चलाने के लिए, जो संभवतः समय और मेमोरी का एक महत्वपूर्ण हिस्सा लेगा, जैसे कुछ का उपयोग करें fdupes -r /

जैसा कि टिप्पणियों में पूछा गया है, आप निम्नलिखित करके सबसे बड़ा डुप्लिकेट प्राप्त कर सकते हैं:

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

यह तब टूटेगा जब आपके फाइलनाम में नई सुर्खियाँ होंगी।


धन्यवाद। मैं सबसे बड़े डूप को कैसे फ़िल्टर कर सकता हूं? मैं आकारों को मानव को पठनीय कैसे बना सकता हूं?
छात्र

@student: की लाइन के साथ कुछ का उपयोग करें (सुनिश्चित करें कि fdupes सिर्फ बिना किसी अतिरिक्त सूचना के, या कट या sed के साथ फ़ाइलनाम को आउटपुट करता है): fdupes ....... | xargs ls -alhd | egrep 'M |G 'मानव पठनीय प्रारूप में फ़ाइलों को रखने के लिए और केवल मेगाबाइट या गीगाबाइट में आकार वाले। वास्तविक आउटपुट के अनुरूप कमांड बदलें।
ओलिवियर दुलैक

2
@OlivierDulac आपको कभी भी ls को पार्स नहीं करना चाहिए । आमतौर पर यह आपके उपयोग के मामले से भी बदतर है, लेकिन यहां तक ​​कि आपके उपयोग के मामले में, आप झूठी सकारात्मकता का जोखिम उठाते हैं।
क्रिस डाउन

@student - एक बार जब आपके पास फ़ाइल नाम होगा, आपको बताने के duलिए पाइप किया sortजाएगा।
क्रिस डाउन

@ क्रिसडाउन: यह सच है कि यह एक बुरी आदत है, और झूठी सकारात्मकता दे सकता है। लेकिन उस मामले में (इंटरैक्टिव उपयोग, और केवल प्रदर्शन के लिए, कोई "आरएम" या उस पर सीधे निर्भर होने वाले किसी भी प्रकार का) यह ठीक है और त्वरित ^ ^ है। मैं उन पृष्ठों से प्यार करता हूँ जिनसे आप लिंक करते हैं, btw (कुछ महीनों से उन्हें पढ़ रहे हैं, और कई उपयोगी इन्फोस से भरे हुए हैं)
ओलिवियर ड्यूलैक

26

एक और अच्छा उपकरण है fslint:

fslint फाइलसिस्टम के साथ विभिन्न समस्याओं को खोजने के लिए एक टूलसेट है, जिसमें डुप्लिकेट फाइलें और समस्याग्रस्त फाइलनेम आदि शामिल हैं।

जीयूआई के अलावा और उन्हें एक्सेस करने के लिए अलग-अलग कमांड लाइन टूल उपलब्ध हैं, जो एक मानक इंस्टॉल पर $ PATH / usr / share / fslint / fslint डायरेक्टरी में बदल सकते हैं, या जोड़ सकते हैं। उस निर्देशिका में इनमें से प्रत्येक कमांड में एक --help विकल्प है, जो इसके मापदंडों का विवरण देता है।

   findup - find DUPlicate files

डेबियन आधारित प्रणालियों पर, आप इसे स्थापित कर सकते हैं:

sudo apt-get install fslint

यदि आप तृतीय पक्ष उपकरण स्थापित नहीं करना चाहते हैं या नहीं कर सकते हैं, तो आप इसे मैन्युअल रूप से भी कर सकते हैं। जिस तरह से इस तरह के अधिकांश कार्यक्रम काम करते हैं, वह फ़ाइल चेकसम की गणना के द्वारा होता है । एक ही 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
क्रिस डाउन

@ क्रिसडाउन हाँ, बस इसे सरल रखना चाहता था। आप जो सुझाव देते हैं वह निश्चित रूप से चीजों को गति देगा। इसलिए मेरे पास इसका अस्वीकरण है कि मेरे उत्तर के अंत में यह धीमा है।
terdon

8

संक्षिप्त उत्तर: हाँ।

लंबा संस्करण: विकिपीडिया 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 का नवीनतम संस्करण पूरी चीज़ों के लिए प्रतीक्षा करने के बजाय केवल आंशिक हैश के साथ मेल खाने वाली फ़ाइलों का समर्थन करता है। बहुत उपयोगी। (आपको इसे प्राप्त करने के लिए git संग्रह को क्लोन करना होगा।) यहाँ विकल्प का उपयोग कर रहा हूँ: jdupes -r -T -T --exclude = size-: 50m --nohidden
बेंजामिन

2

इस कार्य के लिए उपलब्ध ओपन सोर्स सॉफ्टवेयर की सूची के साथ विकिपीडिया का एक लेख ( http://en.wikipedia.org/wiki/List_of_duplicate_file_finders ) था , लेकिन अब इसे हटा दिया गया है

मैं जोड़ना चाहूंगा कि fslint का GUI संस्करण बहुत ही रोचक है, जिससे मास्क का उपयोग करने की अनुमति मिलती है कि कौन सी फ़ाइलों को हटाना है। डुप्लिकेट तस्वीरों को साफ करने के लिए बहुत उपयोगी है।

लिनक्स पर आप उपयोग कर सकते हैं:

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

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

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

2 कई सिस्टम पर अंतिम काम (विंडोज़, मैक और लिनक्स) मैं FSLint के लिए जाँच नहीं की है


5
यहां वास्तविक जानकारी प्रदान करना बेहतर है और न केवल एक लिंक, लिंक बदल सकता है और फिर जवाब में कोई मूल्य नहीं बचा है
एंथन

2
विकिपीडिया पृष्ठ खाली है।
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 एमबी तक हैश करता है।
इसकी कुछ समस्याएं / विशेषताएं हैं:

  • पहले 1 एमबी के बाद अंतर हो सकता है इसलिए परिणाम देखने के लिए उम्मीदवार। मैं बाद में इसे ठीक कर सकता हूं।
  • पहले फ़ाइल के आकार की जाँच करने से इसमें तेजी आ सकती है।
  • केवल 3 एमबी से बड़ी फाइलें लेता है।

मैं इसका उपयोग वीडियो क्लिप की तुलना करने के लिए करता हूं इसलिए यह मेरे लिए पर्याप्त है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.