সদৃশ ফাইলগুলি সন্ধান করুন


90

আমার ডিস্কে নকল ফাইলগুলি খুঁজে পাওয়া সম্ভব যা কিছুটা বিট অভিন্ন তবে বিভিন্ন ফাইল-নাম রয়েছে?


3
নোট করুন যে এটি করার যে কোনও সম্ভাব্য পদ্ধতিতে অবিচ্ছিন্নভাবে আপনার সিস্টেমের প্রতিটি ফাইলকে অন্য একেক ফাইলের সাথে তুলনা করতে হবে । তাই এটি শর্টকাট নেওয়ার সময়ও একটি দীর্ঘ সময় নিতে চলেছে ।
শাদুর

4
@ শাদুর যদি চেকসামের সাথে ঠিক থাকে তবে এটি কেবল হ্যাশগুলির সাথে তুলনা করতে সিদ্ধ হয় - যা বেশিরভাগ সিস্টেমে 10 ^ (5 + -1) সাধারণত <64-বাইট এন্ট্রি থাকে। অবশ্যই আপনাকে ডেটা কমপক্ষে একবার পড়তে হবে। :)
পিটার্ফ

15
@ শাদুর এটি সত্য নয়। আপনি মিলে যাওয়া এসগুলির জন্য পরীক্ষা করে st_size, কেবলমাত্র একইগুলির সাথে একটিগুলি মুছে ফেলা এবং তারপরে কেবল মিলে st_sizes এর জন্য md5sums গণনা করে সময় হ্রাস করতে পারেন ।
ক্রিস ডাউন

6
@ শাদুর এমনকি কোনও হ্যাশ অপারেশনকে অস্বীকার করে এমন একটি অবিশ্বাস্যরূপে মূর্খ পদ্ধতির মাধ্যমে do (n লগ এন) তুলনা করা যায় — (এনএই) নয় — বিভিন্ন ধরণের অ্যালগরিদম (ফাইলের সামগ্রীর উপর ভিত্তি করে) ব্যবহার করে।
ডারোবার্ট

1
@ ক্রিসডাউন হ্যাঁ, আকারের মিলটি আমার মনে থাকা শর্টকাটগুলির মধ্যে একটি হবে।
শাদুর

উত্তর:


104

fdupesএটি করতে পারেন। থেকে man fdupes:

সদৃশ ফাইলগুলির জন্য প্রদত্ত পথ অনুসন্ধান করে। এই জাতীয় ফাইলগুলি ফাইলের আকার এবং MD5 স্বাক্ষরের তুলনা করে পাওয়া যায়, তারপরে একটি বাই বাই বাই তুলনা করে।

ডেবিয়ান বা উবুন্টুতে, আপনি এটি দিয়ে এটি ইনস্টল করতে পারেন 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

আপনার ফাইলের নামগুলিতে নতুন লাইন থাকলে এটি ভেঙে যাবে।


ধন্যবাদ। আমি কীভাবে বৃহত্তম ডুপিকে ফিল্টার করতে পারি? আমি কীভাবে আকারগুলি মানবকে পঠনযোগ্য করে তুলতে পারি?
শিক্ষার্থী

@ স্টুডেন্ট: এই লাইনের সাথে কিছু ব্যবহার করুন (নিশ্চিত করুন যে fdupes কেবলমাত্র কোনও অতিরিক্ত তথ্যবিহীন ফাইলের নামগুলি আউটপুট করে দেয় বা কাট বা সেড করে রাখে): fdupes ....... | xargs ls -alhd | egrep 'M |G 'মানব পাঠযোগ্য বিন্যাসে ফাইল রাখার জন্য এবং শুধুমাত্র মেগাবাইটস বা গিগাবাইটের আকারযুক্ত ফাইলগুলি। আসল আউটপুট অনুসারে কমান্ডটি পরিবর্তন করুন।
অলিভিয়ার ডুলাক

2
@ অলিভিয়ারডুলাক আপনার কখনই এল এস পার্স করা উচিত নয় । সাধারণত এটি আপনার ব্যবহারের চেয়ে খারাপ, তবে আপনার ব্যবহারের ক্ষেত্রেও আপনি মিথ্যা ধনাত্মক ঝুঁকি নিয়ে থাকেন।
ক্রিস ডাউন

@ স্টুডেন্ট - আপনার কাছে ফাইলের নামগুলি পরে, duপাইপযুক্ত sortআপনাকে বলবে।
ক্রিস ডাউন

@ ক্রিসডাউন: এটি সত্য যে এটি একটি খারাপ অভ্যাস, এবং মিথ্যা ইতিবাচক দিক দিতে পারে। তবে সেক্ষেত্রে (ইন্টারেক্টিভ ব্যবহার, এবং কেবল প্রদর্শনের জন্য, কোনও "আরএম" বা সাজানোর কোনও কিছুই সরাসরি তার উপর নির্ভর করে না) এটি দুর্দান্ত এবং দ্রুত ^^ আপনি যে পৃষ্ঠাগুলিতে লিঙ্ক করেছেন, আমি তাদের খুব পছন্দ করি বিটিডব্লিউ (কয়েক মাস ধরে সেগুলি পড়ছি, এবং অনেকগুলি ব্যবহারিক ইনফোতে পূর্ণ)
অলিভিয়ার ডুলাক

26

আর একটি ভাল সরঞ্জাম হ'ল fslint:

ডুপ্লিকেট ফাইল এবং সমস্যাযুক্ত ফাইলের নাম ইত্যাদি সহ ফাইল সিস্টেমে বিভিন্ন সমস্যা খুঁজে পাওয়ার জন্য fslint একটি টুলসেট is

পৃথক কমান্ড লাইন সরঞ্জামগুলি জিইউআই ছাড়াও উপলব্ধ এবং সেগুলি অ্যাক্সেস করার জন্য, একটি স্ট্যান্ডার্ড ইনস্টলের ক্ষেত্রে / usr / share / fslint / fslint ডিরেক্টরিতে to PATH- এ পরিবর্তন বা যুক্ত করতে পারে can এই ডিরেক্টরিতে প্রতিটি কমান্ডের একটি --help বিকল্প রয়েছে যা এর পরামিতিগুলি আরও বিশদ জানায়।

   findup - find DUPlicate files

ডিবিয়ান-ভিত্তিক সিস্টেমগুলিতে, আপনি এটির সাথে এটি ইনস্টল করতে পারেন:

sudo apt-get install fslint

আপনি যদি তৃতীয় পক্ষের সরঞ্জামগুলি না চান বা ইনস্টল করতে না চান তবে আপনি নিজেও এটি করতে পারেন। পথ ধরনের প্রোগ্রাম কাজ গণক হয় ফাইল চেকসাম । একই এমডি 5সামযুক্ত ফাইলগুলিতে প্রায় অবশ্যই একই ডেটা থাকে। সুতরাং, আপনি এর মতো কিছু করতে পারেন:

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
ক্রিস ডাউন

@ ক্রিসডাউন হ্যাঁ, এটি কেবল সহজ রাখতে চেয়েছিলেন। আপনি যা পরামর্শ দেন তা অবশ্যই জিনিসগুলিকে গতিময় করে তুলবে। এ কারণেই আমার উত্তরটির শেষে ধীরে ধীরে এটি সম্পর্কে আমার অস্বীকৃতি রয়েছে।
টেরডন

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আপনার ফাইলের নামগুলিতে কিছু অক্ষর রয়েছে change (যেমন স্থান)


6

আমি fdupes, jdupes এর সাম্প্রতিক বর্ধিত কাঁটা যুক্ত করার চিন্তা করেছি , যা fdupes (যেমন আকারের ফিল্টার) এর চেয়ে দ্রুত এবং আরও বেশি বৈশিষ্ট্যযুক্ত সমৃদ্ধ হওয়ার প্রতিশ্রুতি দেয় :

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

এটি পুনরাবৃত্তভাবে বর্তমান ডিরেক্টরিতে 50MB এর চেয়ে বড় নকল ফাইলগুলি খুঁজে পেতে পারে এবং ফলাফলের তালিকাটি myjdups.txt এ আউটপুট দেয়।

দ্রষ্টব্য, আউটপুটটি আকার অনুসারে বাছাই করা হয়নি এবং যেহেতু এটি বিল্ট না হওয়া হিসাবে প্রদর্শিত হচ্ছে, তাই এটি অর্জনের জন্য আমি উপরের @ ক্রিস_ডাউন উত্তরটি মানিয়েছি:

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 --excolve = আকার-: 50m --nohmitted
বেনিয়ামিন

2

উইকিপিডিয়ায় এই কাজের জন্য উপলব্ধ ওপেন সোর্স সফ্টওয়্যারটির একটি তালিকা সহ একটি নিবন্ধ ছিল ( http://en.wikedia.org/wiki/List_of_dusedate_file_finders ) তবে এটি এখন মুছে ফেলা হয়েছে

আমি যুক্ত করব যে fslint এর GUI সংস্করণটি খুব আকর্ষণীয়, কোন ফাইলগুলি মুছতে হবে তা নির্বাচন করার জন্য মুখোশ ব্যবহার করার অনুমতি দেয়। সদৃশ ফটো পরিষ্কার করতে খুব দরকারী।

লিনাক্সে আপনি এটি ব্যবহার করতে পারেন:

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

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

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

অনেক সিস্টেমে 2 টি শেষ কাজ (উইন্ডোজ, ম্যাক এবং লিনাক্স) আমি এফএসলিন্টের জন্য পরীক্ষা করিনি


5
এখানে সঠিক তথ্য সরবরাহ করা আরও ভাল এবং কেবল একটি লিঙ্ক নয়, লিঙ্কটি পরিবর্তিত হতে পারে এবং তারপরে উত্তরটির কোনও মূল্য নেই
অ্যান্থন

2
উইকিপিডিয়া পৃষ্ঠা খালি।
ihor_dvoretskyi

হ্যাঁ, এটি পরিষ্কার হয়ে গেছে, কী করুণা কাঁপছে ...
মর্ডিকাস এটকবিটাস

আমি এটিকে এই 3 টি সরঞ্জাম দিয়ে সম্পাদনা করেছি
মর্ডিকাসইটকিউবিটাস

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 এমবি-র চেয়ে বড় ফাইল নেয়।

আমি ভিডিও ক্লিপগুলির তুলনা করতে এটি ব্যবহার করি যাতে এটি আমার পক্ষে যথেষ্ট।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.