ফোল্ডার স্তরক্রমের মধ্যে নকল ফাইলের নাম অনুসন্ধান করুন?


29

আমার নামে একটি ফোল্ডার রয়েছে img, এই ফোল্ডারে অনেকগুলি স্তর রয়েছে সাব-ফোল্ডার, যার সবকটিতে চিত্র রয়েছে। আমি তাদের একটি ইমেজ সার্ভারে আমদানি করতে যাচ্ছি।

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

উদাহরণস্বরূপ চিত্রগুলি background.pngএবং background.gifঅনুমতি দেওয়া হবে না কারণ তাদের বিভিন্ন এক্সটেনশন থাকলেও তাদের এখনও একই ফাইলটির নাম রয়েছে। এমনকি তারা পৃথক সাব-ফোল্ডারে থাকলেও তাদের অনন্য হওয়া দরকার।

সুতরাং আমি ভাবছি যে আমি imgএকই নাম (এক্সটেনশন বাদ দিয়ে) থাকা ফাইলগুলির একটি তালিকা খুঁজতে ফোল্ডারে একটি পুনরাবৃত্ত অনুসন্ধান করতে পারি কিনা ।

এমন একটি আদেশ আছে যা এটি করতে পারে?


@ ডেভিডফোস্টার আপনি ঠিক বলেছেন! কেন আমি ভেবেছিলাম যে এটি ডুপ্লিকেট ফাইলগুলি কীভাবে সন্ধান করতে (এবং মুছতে) ডুপ্লিকেট হতে পারে তা আমি জানি না, তবে স্পষ্টভাবে তা নয়।
এলিয়াহ

উত্তর:


17

FSlint Fslint ইনস্টল করুন একটি বহুমুখী সদৃশ সন্ধানকারী যা সদৃশ নামগুলি সন্ধানের জন্য একটি ফাংশন অন্তর্ভুক্ত:

FSlint

উবুন্টুর জন্য এফস্লিন্ট প্যাকেজটি গ্রাফিকাল ইন্টারফেসকে জোর দেয়, তবে এফএস্লিন্ট এফএকিউ - তে ব্যাখ্যা করা হয়েছে প্রোগ্রামগুলির মাধ্যমে একটি কমান্ড-লাইন ইন্টারফেস উপলব্ধ /usr/share/fslint/fslint/--helpডকুমেন্টেশনের জন্য বিকল্পটি ব্যবহার করুন , যেমন:

$ /usr/share/fslint/fslint/fslint --help
File system lint.
A collection of utilities to find lint on a filesystem.
To get more info on each utility run 'util --help'.

findup -- find DUPlicate files
findnl -- find Name Lint (problems with filenames)
findu8 -- find filenames with invalid utf8 encoding
findbl -- find Bad Links (various problems with symlinks)
findsn -- find Same Name (problems with clashing names)
finded -- find Empty Directories
findid -- find files with dead user IDs
findns -- find Non Stripped executables
findrs -- find Redundant Whitespace in files
findtf -- find Temporary Files
findul -- find possibly Unused Libraries
zipdir -- Reclaim wasted space in ext2 directory entries
$ /usr/share/fslint/fslint/findsn --help
find (files) with duplicate or conflicting names.
Usage: findsn [-A -c -C] [[-r] [-f] paths(s) ...]

If no arguments are supplied the $PATH is searched for any redundant
or conflicting files.

-A reports all aliases (soft and hard links) to files.
If no path(s) specified then the $PATH is searched.

If only path(s) specified then they are checked for duplicate named
files. You can qualify this with -C to ignore case in this search.
Qualifying with -c is more restictive as only files (or directories)
in the same directory whose names differ only in case are reported.
I.E. -c will flag files & directories that will conflict if transfered
to a case insensitive file system. Note if -c or -C specified and
no path(s) specifed the current directory is assumed.

ব্যবহারের উদাহরণ:

$ /usr/share/fslint/fslint/findsn /usr/share/icons/ > icons-with-duplicate-names.txt
$ head icons-with-duplicate-names.txt 
-rw-r--r-- 1 root root    683 2011-04-15 10:31 Humanity-Dark/AUTHORS
-rw-r--r-- 1 root root    683 2011-04-15 10:31 Humanity/AUTHORS
-rw-r--r-- 1 root root  17992 2011-04-15 10:31 Humanity-Dark/COPYING
-rw-r--r-- 1 root root  17992 2011-04-15 10:31 Humanity/COPYING
-rw-r--r-- 1 root root   4776 2011-03-29 08:57 Faenza/apps/16/DC++.xpm
-rw-r--r-- 1 root root   3816 2011-03-29 08:57 Faenza/apps/22/DC++.xpm
-rw-r--r-- 1 root root   4008 2011-03-29 08:57 Faenza/apps/24/DC++.xpm
-rw-r--r-- 1 root root   4456 2011-03-29 08:57 Faenza/apps/32/DC++.xpm
-rw-r--r-- 1 root root   7336 2011-03-29 08:57 Faenza/apps/48/DC++.xpm
-rw-r--r-- 1 root root    918 2011-03-29 09:03 Faenza/apps/16/Thunar.png

ধন্যবাদ এটি কাজ করেছে। কিছু ফলাফল বেগুনি এবং কিছু সবুজ। আপনি কি জানেন যে বিভিন্ন রঙের অর্থ কী?
জেডি আইজ্যাকস

@ জন দেখে মনে হচ্ছে এফএস্লিন্ট ls -lএর আউটপুটটি ফর্ম্যাট করতে ব্যবহার করছে। এই প্রশ্নটির বর্ণগুলি কী বোঝায় তা বোঝানো উচিত।
ündrük

এফএস্লিন্টের প্রচুর নির্ভরতা রয়েছে।
নবীন

31
find . -mindepth 1 -printf '%h %f\n' | sort -t ' ' -k 2,2 | uniq -f 1 --all-repeated=separate | tr ' ' '/'

মতামত অনুযায়ী, এটি ফোল্ডারগুলিও খুঁজে পাবে। এটি ফাইলগুলিতে সীমাবদ্ধ করার জন্য এখানে আদেশ দেওয়া হল:

find . -mindepth 1 -type f -printf '%p %f\n' | sort -t ' ' -k 2,2 | uniq -f 1 --all-repeated=separate | cut -d' ' -f1

আমি সমাধানটি পরিবর্তন করেছি যাতে এটি সমস্ত নকলের সম্পূর্ণ (আপেক্ষিক) পথে ফেরত দেয়। দুর্ভাগ্যক্রমে এটি ধরে নেওয়া হয় যে পাথের নামগুলিতে শ্বেত-স্থান নেই কারণ uniqএকটি ভিন্ন ক্ষেত্রের ডেলিমিটার নির্বাচন করার জন্য কোনও বৈশিষ্ট্য সরবরাহ করে না।
ডেভিড ফোস্টার

@ ডেভিডফোরস্টার, আপনার পুনর্নির্মাণ 6 একটি উন্নতি হয়েছিল, কিন্তু সেখানে আপনার মন্তব্য সম্পর্কে, কখন থেকে sedঅপ্রচলিত? রহস্যময়? অবশ্যই। অচল? আমার এরকম কিছু জানা নেই. (এবং আমি স্রেফ চেক করতে সন্ধান করেছি))
সিপি.ইএনজিআর

@ cp.engr: সেড অপ্রচলিত নয়। এটির অনুরোধটি আমার অন্য পরিবর্তনের পরে অচল হয়ে পড়ে।
ডেভিড ফোস্টার

@ ডেভিডফোস্টার, অপ্রচলিত আমার কাছে তখন সঠিক শব্দ বলে মনে হয় না। আমি মনে করি "বিভ্রান্ত" আরও ভাল ফিট হবে। নির্বিশেষে, স্পষ্ট করার জন্য ধন্যবাদ।
cp.engr

@ সিপি.এএনজিআর: পরামর্শের জন্য ধন্যবাদ! আমি এই শব্দটি জানতাম না তবে পরিস্থিতি আরও ভাল মানায়।
ডেভিড ফোস্টার

8

নামের একটি ফাইল এ এটি সংরক্ষণ করুন duplicates.py

#!/usr/bin/env python

# Syntax: duplicates.py DIRECTORY

import os, sys

top = sys.argv[1]
d = {}

for root, dirs, files in os.walk(top, topdown=False):
    for name in files:
        fn = os.path.join(root, name)
        basename, extension = os.path.splitext(name)

        basename = basename.lower() # ignore case

        if basename in d:
            print(d[basename])
            print(fn)
        else:
            d[basename] = fn

তারপরে ফাইলটি সম্পাদনযোগ্য করুন:

chmod +x duplicates.py

যেমন চালানো যেমন:

./duplicates.py ~/images

এর একই বেসন (1) ফাইলগুলির জোড়া হওয়া আউটপুট করা উচিত। পাইথনে লেখা, আপনার এটি পরিবর্তন করা উচিত।


এটি সঠিকভাবে কাজ করছে বলে মনে হয় না। এটি সনাক্ত P001.ORFএবং P001 (1).ORFডুপ্লিকেট হিসাবে এবং এটি মনে হয় যে আমার 60% ফাইল নকল যা ভুল আমি সত্যই নিশ্চিত। fslint3 টির কাছাকাছি থাকা নকল ফাইলের একটি আসল সংখ্যার সন্ধান পেয়েছে।
রল্ফ

3

আমি ধরে নিচ্ছি আপনাকে কেবল এই "নকলগুলি" দেখতে হবে, তারপরে সেগুলি ম্যানুয়ালি হ্যান্ডেল করুন। যদি তা হয় তবে এই বাশ 4 কোডটি আপনি যা চান তা করতে হবে।

declare -A array=() dupes=()
while IFS= read -r -d '' file; do 
    base=${file##*/} base=${base%.*}
    if [[ ${array[$base]} ]]; then 
        dupes[$base]+=" $file"
    else
        array[$base]=$file
    fi
done < <(find /the/dir -type f -print0)

for key in "${!dupes[@]}"; do 
    echo "$key: ${array[$key]}${dupes[$key]}"
done

দেখুন http://mywiki.wooledge.org/BashGuide/Arrays#Associative_Arrays এবং / অথবা এসসিয়েতিভ আরে সিনট্যাক্স উপর সহায়তার জন্য ব্যাশ ম্যানুয়াল।


টার্মিনালে আমি কীভাবে এরকম একটি কমান্ড কার্যকর করব? এই ফাইলটি প্রথমে একটি ফাইল সংরক্ষণ করতে এবং ফাইলটি সম্পাদন করার দরকার কি?
জেডি আইজ্যাকস

@ জন আইজ্যাকস আপনি এটি টার্মিনালে অনুলিপি / পেস্ট করতে পারেন বা আপনি এটি একটি ফাইলের মধ্যে রেখে স্ক্রিপ্ট হিসাবে চালাতে পারেন। উভয় ক্ষেত্রে একই অর্জন করা হবে।
গিরিহা

1

এটি নাম:

#!/bin/bash
#
#  find for jpg/png/gif more files of same basename 
#
# echo "processing ($1) $2"
bname=$(basename "$1" .$2)
find -name "$bname.jpg" -or -name "$bname.png"

এটি সম্পাদনযোগ্য করুন:

chmod a+x bname 

এটি আহ্বান:

for ext in jpg png jpeg gif tiff; do find -name "*.$ext" -exec ./bname "{}" $ext ";"  ; done

প্রো:

  • এটি সোজা এবং সহজ, অতএব এক্সটেনসেবল।
  • ফাইল নামগুলিতে ফাঁকা, ট্যাবগুলি, লাইন ব্রেক এবং পৃষ্ঠাফিডগুলি পরিচালনা করে af (এক্সটেনশন-নামতে এমন কোনও জিনিস ধরে নিচ্ছি)।

কন:

  • এটি সর্বদা ফাইলটি নিজেই সন্ধান করে এবং যদি এটি a.jpg এর জন্য a.gif সন্ধান করে তবে এটি a.gif এর জন্যও a.jpg সন্ধান করবে। সুতরাং একই বেসনামের 10 টি ফাইলের জন্য এটি শেষ পর্যন্ত 100 টি মিল খুঁজে পাবে।

0

আমার প্রয়োজনের জন্য লোভবার্গের স্ক্রিপ্টে উন্নতি হয়েছে (স্ক্যান করার সময় গ্রুপযুক্ত আউটপুট, ব্ল্যাকলিস্ট, ক্লিনার আউটপুট অন্তর্ভুক্ত)। আমি একটি 10 ​​টিবি ড্রাইভ স্ক্যান করছিলাম, সুতরাং আমার কিছুটা ক্লিনার আউটপুট প্রয়োজন।

ব্যবহার:

python duplicates.py DIRNAME

duplicates.py

    #!/usr/bin/env python

    # Syntax: duplicates.py DIRECTORY

    import os
    import sys

    top = sys.argv[1]
    d = {}

    file_count = 0

    BLACKLIST = [".DS_Store", ]

    for root, dirs, files in os.walk(top, topdown=False):
        for name in files:
            file_count += 1
            fn = os.path.join(root, name)
            basename, extension = os.path.splitext(name)

            # Enable this if you want to ignore case.
            # basename = basename.lower()

            if basename not in BLACKLIST:
                sys.stdout.write(
                    "Scanning... %s files scanned.  Currently looking at ...%s/\r" %
                    (file_count, root[-50:])
                )

                if basename in d:
                    d[basename].append(fn)
                else:
                    d[basename] = [fn, ]

    print("\nDone scanning. Here are the duplicates found: ")

    for k, v in d.items():
        if len(v) > 1:
            print("%s (%s):" % (k, len(v)))
            for f in v:
                print (f)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.