ডুপ্লিকেটগুলি মুছার উপায় কি fdupes -rdN এর চেয়ে বেশি পরিশোধিত?


22

সম্প্রতি আমার প্রচুর নকল মুছতে হবে। আমি তিন বা চারটি ফাইল সিস্টেমগুলি মার্জ করছি এবং আমি চাই স্থানটি অর্থনৈতিকভাবে ব্যবহৃত হোক। প্রথমে fdupesদেখে মনে হয়েছিল এটি কাজের সেরা হাতিয়ার তবে আমি ক্রমশ সীমাবদ্ধতায় চলেছি।

আদেশ বিবেচনা করুন fdupes -rdN somedirectory/। এটি সোমডাইরেক্টরির সাব-ডিরেক্টরিতে সমস্ত ফাইলের একটি হ্যাশ তৈরি করে।

এবং যখন এটি সদৃশদের মুখোমুখি হয়, এটি সেগুলি মুছে দেয়, যাতে সমস্ত কিছুর একটি অনুলিপি থাকে।

তবে যদি আমি রাখতে চাই somedirectory/subdirectory1/somefileএবং সেখানে চারটি সদৃশ, এবং প্রোগ্রামটি প্রথমে একটি অনুলিপিটির মুখোমুখি হয়? তারপরে এটি মুছে যায় somedirectory/subdirectory1/somefile, যা আমি চাই না।

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

আমি কিছু লিখতে সক্ষম হতে চাই

killdupes -rdN --keep=filesin,somedirectories,separated,by,commas somedirectory/

আমি একই জিনিস খুঁজছেন ছিল এবং আমি এই পাওয়া superuser.com/a/561207/218922
Alexis

উত্তর:


5

আপনি যে কার্যকারিতাটি অনুসন্ধান করেছেন তা fdupesস্টকটিতে পাওয়া যায় না , আমি কাঁটাচামচ fdupes (আমার কাঁটাচামচ বলা হয় jdupes) এবং কিছু বৈশিষ্ট্য যুক্ত করেছি যা নির্দিষ্ট পরিস্থিতিতে এই সমস্যাটিকে সমাধান করতে পারে। উদাহরণস্বরূপ, উল্লিখিত ক্ষেত্রে যেখানে somedirectory/subdirectory1/somefileডুপ্লিকেটগুলি মুছে ফেলার সময় আপনি রাখতে চান (সেখানে dএবং Nএকসাথে স্যুইচ হয়) এবং তত্ক্ষণাত্ নীচে পৃথক কোনও ফাইল নেই somedirectory, প্রথমে এবং স্যুইচ jdupesদিয়ে প্রতিটি তাত্ক্ষণিক সাব-ডাইরেক্টরি পাথ দেওয়া যেতে পারে (যা আদেশ অনুসারে ফাইলগুলি সাজায়) লাইন প্যারামিটার অর্ডার আগে):subdirectory1-O

jdupes -nrdNO somedirectory/subdirectory1 somedirectory/subdirectory2 somedirectory/subdirectory3

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

অদূর ভবিষ্যতে, আমি একটি ফিল্টারিং সিস্টেম যুক্ত করার পরিকল্পনা করছি যাতে jdupesএটি -Nবিশ্বব্যাপী বা প্রতি-পরামিতি ভিত্তিতে ফাইল অন্তর্ভুক্তকরণ / বর্জন, ক্রিয়াকলাপের সংরক্ষণ এবং এই জাতীয় "ফিল্টার স্ট্যাকস" প্রয়োগের উপর বিশাল পরিমাণ নিয়ন্ত্রণ সক্ষম করবে । এই বৈশিষ্ট্যটি অত্যন্ত প্রয়োজন; আমি "শূন্য-অনুলিপিগুলি পুনরাবৃত্তভাবে স্বতঃ-মোছা করুন তবে সর্বদা somedirectory/subdirectory1/somefileহিসাবে-যেমন সংরক্ষণ করুন " তেমন কিছু কল্পনা করি :

jdupes -nrdN --filter=preserve:somedirectory/subdirectory1/somefile somedirectory/


4

ডুপ্লিকেট ফাইলগুলি একসাথে হার্ডলিঙ্ক করার বিষয়ে কী? এইভাবে স্থানটি কেবল একবার ব্যবহার করা হয়েছে তবে তারা এখনও সমস্ত পথে রয়েছে। এটির সাহায্যে ধরা পড়েছে যে হার্ডলিঙ্কযুক্ত ফাইলগুলিকে জায়গায় পরিবর্তন করতে হবে (তাদের কেবল ফাইল মুছতে এবং নতুন সামগ্রী দিয়ে পুনরায় তৈরি করা উচিত)। অন্য পদ্ধতিটি হ'ল ফাইলগুলি এক সাথে সিমিলিংক করা, যদিও আপনার "প্রাথমিক" ফাইলটি কোনটি সিদ্ধান্ত নেওয়ার একই সমস্যা রয়েছে। এটি নিম্নলিখিত স্ক্রিপ্টের সাহায্যে করা যেতে পারে (যদিও মনে রাখবেন যে এটি ফাঁকযুক্ত ফাইলের নামগুলি হ্যান্ডেল করে না)।

fdupes --quiet --recurse --sameline somedirectory/ | while read SOURCE DESTS; do
    for DEST in $DESTS; do
        ln -f $SOURCE $DEST
    done
done

1
আপনার jdupesপরিবর্তে ব্যবহার করে fdupesসহজেই যেতে পারেন jdupes -nrL somedirectory/যা ব্যাপকভাবে দ্রুত।
জোডি লি ব্রুচন 21

1
Jdupes এর লিঙ্কে টাইপ করুন। সুবিধার লিঙ্ক: github.com/jbruchon/jdupes
উইলিয়ামস

4

আমি এটি অন্য কোথাও দেখতে পাইনি: আপনি যা চান তা বলুন Say আপনার কাছে / এমএনটি / ফোল্ডার-ট্রি -১ / এমএনটি / ফোল্ডার-ট্রি -২ রয়েছে। আপনি প্রতিটি ডুপ্প মুছে ফেলতে চান না, তবে গাছ -2 এ যদি কোনও ফাইল উপস্থিত থাকে এবং গাছের সাথে একই পাত এবং নামের সাথে একটি অভিন্ন ফাইল উপস্থিত থাকে, তবে গাছ -2 থেকে মুছে ফেলুন।

সতর্কতা: এটি বেশ পরিশ্রুত এবং যদি আপনি সীমাবদ্ধ শেল দক্ষতার সাথে এটি অনুলিপি করতে চান তবে সাবধান হন।

fdupes -rn /mnt/folder-tree-1/ /mnt/folder-tree-2/ > dupes-all.txt

fgrep /mnt/folder-tree-1/ dupes-all.txt | while read line
do
if grep -q "`echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2/|'`" dupes-all.txt
then
    echo rm \"$(echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2//|')\"
fi
done > rm-v2-dupes.sh

বা সমস্ত এক লাইনে:

fdupes -rn /mnt/folder-tree-1/ /mnt/folder-tree-2/ > dupes-all.txt; fgrep /mnt/folder-tree-1/ dupes-all.txt | while read line; do if grep -q "`echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2/|'`" dupes-all.txt; then echo rm \"$(echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2/|')\"; fi; done > rm-v2-dupes.sh

এরপরে, rm-v2-dupes.sh পরিদর্শন ও সম্পাদন করুন


4

আমিও একই প্রশ্ন করেছিলাম. আপনার যদি অনেক অনুলিপি থাকে fdupes /my/directory/ -rdNতবে ফাইলটি সর্বাধিক পুরানো সংশোধিত তারিখের সাথে রাখে, বা বেশ কয়েকটি ফাইলে যদি একই সংশোধিত তারিখ থাকে তবে প্রথমে একটিটি খুঁজে পাওয়া যায়।

যদি সংশোধিত তারিখটি আপনার পক্ষে গুরুত্বপূর্ণ না হয় touchতবে আপনি যে ডিরেক্টরিটি রাখতে চান তা ফাইলগুলি রাখতে পারেন। আপনি যদি touchতাদের বর্তমানের তারিখ এবং সময় দিয়ে বেছে নেন তবে fdupes -rdNiতা বর্তমান তারিখের সাথে রাখবে। অথবা আপনি touchমুছে ফেলা এবং fdupes -rdNস্বাভাবিক হিসাবে ব্যবহার করতে চান তার চেয়ে আগের তারিখের সাথে ফাইলগুলি রাখতে পারেন ।

আপনার যদি পরিবর্তনের তারিখটি রাখতে হয় তবে আপনাকে অন্য একটি পদ্ধতির ব্যবহার করতে হবে।


3

পূর্বের উত্তরের সাথে একটি টুইস্ট যুক্ত করতে। আমি নীচের কোডটি একাধিকবার ব্যবহার করেছি, | grepআমি যে ফোল্ডারটি মুছতে চাই তা পৃথক করার জন্য একটি সহজ উত্তর দিয়ে সামান্য পরিবর্তন করেছি।

`fdupes -r -n -S /directory | grep /delete-from-directory | sed -r "s/^/rm \"/" | sed -r "s/$/\"/" >remove-duplicate-files.sh`

আবার, এটি তালিকাবদ্ধ সমস্ত ফাইল মুছে ফেলার জন্য একটি sh ফাইল তৈরি করবে, কোনও মন্তব্য করা লাইন নেই। অবশ্যই আপনি এখনও নির্দিষ্ট রেখাগুলি / ফাইলগুলি রাখতে চান যা মন্তব্য করতে ফাইল সম্পাদনা করতে পারেন।

বড় ডিরেক্টরিগুলির জন্য আরেকটি ইঙ্গিত হ'ল fdupes একটি টেক্সট ফাইলটিতে চালানো, তারপরে | grepএবং | sedআমার ফলাফলটি না পাওয়া পর্যন্ত পরীক্ষা করা ।

`fdupes -r -n -S /directory > duplicate-files.txt`
`cat duplicate-files.txt | grep /delete-from-directory | sed -r "s/^/rm \"/" | sed -r "s/$/\"/" >remove-duplicate-files.sh`

2

sedশেল ফাইল তৈরি করতে ব্যবহার করুন যাতে আপনার প্রতিটি সদৃশ ফাইল মুছে ফেলার জন্য মন্তব্য করা আদেশগুলি থাকতে পারে:

fdupes -r -n -S /directory | sed -r "s/^/#rm \"/" | sed -r "s/$/\"/" >remove-duplicate-files.sh

ফলস্বরূপ remove-duplicate-files.shযে ফাইলটি আমরা সবে তৈরি করেছি তা প্রতিটি লাইনে মন্তব্য করা হবে। আপনি মুছে ফেলতে চান ফাইলগুলি মন্তব্য করুন। তারপরে দৌড়াও sh remove-duplicate-files.sh। ভাল খবর!

হালনাগাদ

ঠিক আছে, আপনি যদি কিছু নির্দিষ্ট ডিরেক্টরিতে কেবল ফাইলগুলি মুছতে না চান তবে এটি এতটা সহজ :

fdupes -S /directory|sed '/^$/d' |sed -r "s/^[0-9]/#&/" > duple_list

python exclude_duplicates.py -f /path/to/dupe_list --delimiter='#' --keep=/full/path/to/protected/directory1,/full/path/to/protected/directory2\ with\ spaces\ in\ path >remove-duplicate-files-keep-protected.sh

কোথায় exclude_duplicates.py:

#/usr/bin/python
# -*- coding: utf-8 -*-
# exclude_duplicates.py
"""
THE SCRIPT DOESN'T DELETE ANYTHING, IT ONLY GENERATES TEXT OUTPUT.
Provided a list of duplicates, such as fdupes or fslint output,
generate a bash script that will have all duplicates in protected
directories commented out. If none of the protected duplicates are
found in a set of the same files, select a random unprotected
duplicate for preserving.
Each path to a file will be transformed to an `rm "path"` string which
will be printed to standard output.     
"""

from optparse import OptionParser
parser = OptionParser()
parser.add_option("-k", "--keep", dest="keep",
    help="""List of directories which you want to keep, separated by commas. \
        EXAMPLE: exclude_duplicates.py --keep /path/to/directory1,/path/to/directory\ with\ space\ in\ path2""",
    metavar="keep"
)
parser.add_option("-d", "--delimiter", dest="delimiter",
    help="Delimiter of duplicate file groups", metavar="delimiter"
)
parser.add_option("-f", "--file", dest="file",
    help="List of duplicate file groups, separated by delimiter, for example, fdupes or fslint output.", metavar="file"
)

(options, args) = parser.parse_args()
directories_to_keep = options.keep.split(',')
file = options.file
delimiter = options.delimiter

pretty_line = '\n#' + '-' * 35
print '#/bin/bash'
print '#I will protect files in these directories:\n'
for d in directories_to_keep:
    print '# ' + d
print pretty_line

protected_set = set()
group_set = set()

def clean_set(group_set, protected_set, delimiter_line):
    not_protected_set = group_set - protected_set
    while not_protected_set:
        if len(not_protected_set) == 1 and len(protected_set) == 0:
            print '#randomly selected duplicate to keep:\n#rm "%s"' % not_protected_set.pop().strip('\n')
        else:
            print 'rm "%s"' % not_protected_set.pop().strip('\n')
    for i in protected_set: print '#excluded file in protected directory:\n#rm "%s"' % i.strip('\n')
    print '\n#%s' % delimiter_line
file = open(file, 'r')
for line in file.readlines():
    if line.startswith(delimiter):
        clean_set(group_set, protected_set, line)
        group_set, protected_set = set(), set()
    else:
        group_set = group_set|{line}
        for d in directories_to_keep:
            if line.startswith(d): protected_set = protected_set|{line}
else:
    if line: clean_set(group_set, protected_set, line)

ফলস্বরূপ remove-duplicate-files-keep-protected.shযে ফাইলটি আমরা সবে তৈরি করেছি তাতে সুরক্ষিত ডিরেক্টরি থেকে সমস্ত ফাইল মন্তব্য করা হবে। আপনার প্রিয় পাঠ্য সম্পাদকটিতে এই ফাইলটি খুলুন, সবকিছু ঠিক আছে কিনা তা পরীক্ষা করে দেখুন। তারপর এটি চালান। ভয়েলা (sic)!


আমি এটি ভেবেছিলাম, তবে এটি যথেষ্ট স্বয়ংক্রিয় নয় ted মূর্খতার সাথে, একাধিক ফাইল সিস্টেম জুড়ে ফাঁকে থাকা নকলগুলি নিয়ে কাজ করার সময় আমি এই পদ্ধতিটির সাথে ডেটা ক্ষতিগ্রস্থ করেছি ... fdupes এর আউটপুট প্রদত্ত অগ্রাধিকার নির্ধারণের কোনও উপায় নেই। মূলত এই তথ্য হ্রাস রোধ করার জন্য আমাকে হাতে 10000 ফাইলের মধ্যে ট্রল করতে হবে ... সুতরাং, ধন্যবাদ না ... আসলে, তথ্য হ্রাস হ'ল এই কারণটি আমি এই প্রশ্নটি জিজ্ঞাসা করেছি।
ixtmixilix

@ ixtmixilix, ভাল, ম্যানুয়াল পদ্ধতি ব্যবহারকারীর মনোযোগের উপর নির্ভরশীল, এখানে নতুন কিছু নেই। আপনি যদি আরও কিছু স্বয়ংক্রিয় চান তবে উপরের আপডেট হওয়া উত্তরটি চেকআউট করুন।
ইভান খারলামভ

2

এই জাতীয় কিছু সম্পর্কে কি?

#!/bin/bash

DUPE_SEARCH_DIR=somedir/
PREFERRED_DIRS=("somedir/subdir1" "somedir/subdir2")
DUPE_FILE=/tmp/`basename $0`_found-duplicates

delete_dupes() {
    while read line ; do
        if [ -n "$line" ] ; then
            matched=false
            for pdir in "${PREFERRED_DIRS[@]}" ; do
                if [[ $line == $pdir/* ]] ; then
                    matched=true
                    break
                fi
            done
            if ! $matched ; then
                rm -v "$line"
            fi
        fi
    done < "$DUPE_FILE"
}

cleanup() {
    rm -f $DUPE_FILE
}

trap cleanup EXIT

# get rid of normal dupes, preserve first & preserve preferred
fdupes -rf "$DUPE_SEARCH_DIR" > $DUPE_FILE
delete_dupes

# get rid of preserve dupes, preserve preferred
fdupes -r "$DUPE_SEARCH_DIR" > "$DUPE_FILE"
delete_dupes
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.