কোনও ডিরেক্টরিতে নকল ফাইলগুলি কীভাবে সরানো যায়?


25

আমি একটি ডিরেক্টরিতে প্রচুর চিত্র ডাউনলোড করেছি।
ডাউনলোডাররা ফাইলগুলির নাম পরিবর্তন করে যা ইতিমধ্যে বিদ্যমান।
আমি নিজে কিছু ফাইলের নামও দিয়েছি।

a.jpg
b.jpg
b(2).jpg
hello.jpg      <-- manually renamed `b(3).jpg`
c.jpg
c(2).jpg
world.jpg      <-- manually renamed `d.jpg`
d(2).jpg
d(3).jpg

নকলগুলি কীভাবে সরিয়ে ফেলবেন? ফলাফলটি হওয়া উচিত:

a.jpg
b.jpg
c.jpg
world.jpg

দ্রষ্টব্য: নাম কিছু যায় আসে না। আমি শুধু ইউনিক ফাইল চাই

উত্তর:


27

bash 4.x

#!/bin/bash
declare -A arr
shopt -s globstar

for file in **; do
  [[ -f "$file" ]] || continue

  read cksm _ < <(md5sum "$file")
  if ((arr[$cksm]++)); then 
    echo "rm $file"
  fi
done

এটি উভয়ই পুনরাবৃত্ত এবং কোনও ফাইলের নাম পরিচালনা করে। ডাউনসাইড হ'ল এসোসিয়েটিভ অ্যারেগুলি এবং পুনরাবৃত্ত অনুসন্ধানের সক্ষমতা ব্যবহারের দক্ষতার জন্য এটির 4.x সংস্করণ প্রয়োজন। echoআপনি ফলাফল পছন্দ হলে অপসারণ ।

গোক সংস্করণ

gawk '
  {
    cmd="md5sum " q FILENAME q
    cmd | getline cksm
    close(cmd)
    sub(/ .*$/,"",cksm)
    if(a[cksm]++){
      cmd="echo rm " q FILENAME q
      system(cmd)
      close(cmd)
    }
    nextfile
  }' q='"' *

মনে রাখবেন যে এটি এখনও সেই ফাইলগুলিতে ভেঙে যাবে যার নামে ডাবল-কোট রয়েছে। এটির সাথে ঘুরে দেখার কোনও আসল উপায় নেই awkechoআপনি ফলাফল পছন্দ হলে অপসারণ ।


ঠিক আছে, বাশ সংস্করণটি আমার পক্ষে কাজ করেছে, তবে আমার পরীক্ষায়, অনুরূপ 2 টি ফোল্ডার সহ এটি একটি ফোল্ডারে অর্ধেক অনুলিপি এবং অন্যটিতে অর্ধেক মুছে ফেলেছে। কেন। আমি এক ফোল্ডারের প্রত্যেককে (নকল) মুছে ফেলার আশা করব।
ফেরোও

@ ফেরোও সম্ভবত তারা সঠিক সদৃশ ছিল না। আমার স্ক্রিপ্টটি সদৃশতা নির্ধারণ করতে যে এমডি 5 হ্যাশ ব্যবহার করছে তা কেবল একটি বিট হলে সম্পূর্ণ আলাদা হবে। আপনি যদি প্রতিটি ফাইলের হ্যাশ দেখতে চান তবে আপনি echo cksmলাইনটি শুরু করার ঠিক পরে যোগ readকরতে পারেন।
সিজেএক্স

না, সমস্ত "অনুলিপি" (অনুলিপিগুলি) অপসারণ করা হয়েছে, বাকি 1 সংস্করণ, আসল বলি। অর্ধেক অনুলিপি একটি ফোল্ডার থেকে মুছে ফেলা হয়েছে, এবং অন্য অর্ধেকটি অন্য ফোল্ডার থেকে (অনুলিপিগুলির 100% মুছা)। আমার 100% অতিরিক্ত পরিমাণে অনুলিপিগুলির জন্য, সম্পূর্ণতার জন্য নয়
ফেরোও

@ ফেরোওও আমি দেখছি **সেক্ষেত্রে মনে হয় বাশ যখন এটির পুনরাবৃত্ত পথটি প্রসারিত করে, তালিকাটি এমনভাবে অর্ডার করে যাতে দুটি ফোল্ডার সমস্ত ফোল্ডার 1 এর পরিবর্তে আন্তঃবাহিত হয় সমস্ত ফোল্ডার 2 এর পরে। স্ক্রিপ্টটি সর্বদা প্রথম 'আসল' ছেড়ে যাবে এটি তালিকার মাধ্যমে পুনরাবৃত্তি হওয়ার সাথে সাথে এটি আঘাত করে। লাইনের echo $fileআগে আপনি readএটি সত্য কিনা তা দেখতে পারেন।
সিজেএক্স

45

fdupes আপনার পছন্দসই সরঞ্জাম। বর্তমান ডিরেক্টরিতে সমস্ত নকল ফাইল (কন্টেন্ট দ্বারা, নাম দ্বারা নয়) সন্ধান করতে:

fdupes -r .

নকল ফাইল মুছে ফেলার বিষয়টি ম্যানুয়ালি নিশ্চিত করতে:

fdupes -r -d .

সমস্ত অনুলিপি স্বয়ংক্রিয়ভাবে মুছে ফেলার জন্য প্রতিটি ডুপ্লিকেট করা ফাইলের প্রথমটি ( সতর্ক হওয়া উচিত, এই সতর্কতা, এটি অনুরোধ হিসাবে ফাইলগুলি মুছে ফেলা হবে ):

fdupes -r -f . | grep -v '^$' | xargs rm -v

আমি মুছে ফেলার আগে ম্যানুয়ালি ফাইলগুলি পরীক্ষা করার পরামর্শ দেব:

fdupes -rf . | grep -v '^$' > files
... # check files
xargs -a files rm -v

দুর্দান্ত কাজ করে তবে ফাইলের নামের ফাঁকে ফাঁকে থাকলে ব্যর্থ হয়।
ড্যানিয়েল ওল্ফ

1
Xargs বিকল্প চেষ্টা @DanielWolf-d '\n'
জ্যাকব

1
এছাড়াও, fdupes এর নতুন সংস্করণগুলিতে সদৃশ ফাইলগুলির তালিকায় প্রথমটি বাদ দিয়ে সবগুলি মুছে ফেলার বিল্ট-ইন বিকল্প রয়েছে: fdupes -rdN .যেখানে -r পুনরাবৃত্তি হয়, -d মুছে ফেলা হয় এবং -N কোনও প্রম্পট হয় না
র্যান্ড

আপনাকে ধন্যবাদ, এটি অসামান্য কারণ 2 টিরও বেশি অনুলিপি সনাক্ত করতে পারে এবং আপনি কোনটি দ্বৈত সংরক্ষণ করতে চান তা বাছাই করতে দেয় (বা তাদের সমস্ত)।
স্মিটারলিঙ্ক


1

কিছুটা অলস হওয়ার কারণে অনলাইনে একটি খুঁজে পেতে আমার বেশি দিন লাগেনি ।

আপনাকে প্রথমে প্রতিটি ফাইলের একটি সিআরসি চেকসাম তৈরি করতে হবে, কারণ আপনি অবশ্যই কেবল সঠিক নকলগুলি সরাতে চান।

cksum  *.jpg | sort -n > filelist

তারপরে, এই ফাইলের তালিকাটি পুনরুক্ত করুন, চেকসামে পড়া এবং ফাইলের নামও। দুটি চেকসাম একই হলে ফাইলটি সরানো হবে। এই কাজ করে, যেহেতু বাছাইটি সংখ্যাসূচক হয় এবং কেবল চেকসামগুলিতে বাছাই করে, যা ফাইলগুলি নকল করে।

old=""
while read sum lines filename
do
      if [[ "$sum" != "$old" ]] ; then
            old="$sum"
            continue
      fi
      rm -f "$filename"
done < filelist

স্পষ্টতই, এটি পুনরাবৃত্তির সাথে কাজ করে না।


1

কীভাবে ফাইলগুলিতে অনন্য সামগ্রী রয়েছে তা পরীক্ষা করবেন?

if diff "$file1" "$file2" > /dev/null; then
    ...

ডিরেক্টরিতে আমরা ফাইলগুলির তালিকা কীভাবে পেতে পারি?

files="$( find ${files_dir} -type f )"

আমরা সেই তালিকা থেকে যে কোনও 2 ফাইল পেতে পারি এবং তাদের নাম আলাদা এবং সামগ্রীগুলি একই কিনা তা পরীক্ষা করতে পারি।

#!/bin/bash
# removeDuplicates.sh

files_dir=$1
if [[ -z "$files_dir" ]]; then
    echo "Error: files dir is undefined"
fi

files="$( find ${files_dir} -type f )"
for file1 in $files; do
    for file2 in $files; do
        # echo "checking $file1 and $file2"
        if [[ "$file1" != "$file2" && -e "$file1" && -e "$file2" ]]; then
            if diff "$file1" "$file2" > /dev/null; then
                echo "$file1 and $file2 are duplicates"
                rm -v "$file2"
            fi
        fi
    done
done

উদাহরণস্বরূপ, আমরা কিছু dir আছে:

$> ls .tmp -1
all(2).txt
all.txt
file
text
text(2)

সুতরাং 3 টি অনন্য ফাইল রয়েছে।

স্ক্রিপ্টটি চালাতে দাও:

$> ./removeDuplicates.sh .tmp/
.tmp/text(2) and .tmp/text are duplicates
removed `.tmp/text'
.tmp/all.txt and .tmp/all(2).txt are duplicates
removed `.tmp/all(2).txt'

এবং আমরা কেবল 3 টি ফাইল ফাঁস পেয়েছি।

$> ls .tmp/ -1
all.txt
file
text(2)

1

সদৃশ ফাইলগুলি মুছতে এই ক্ষুদ্র স্ক্রিপ্টটি লিখেছিলাম

https://gist.github.com/crodas/d16a16c2474602ad725b

মূলত এটি /tmp/list.txtফাইল এবং তাদের হ্যাশগুলির মানচিত্র তৈরি করতে একটি অস্থায়ী ফাইল ( ) ব্যবহার করে। পরে আমি সেই ফাইলগুলি এবং ইউনিক্স পাইপগুলির যাদুটি বাকীটি করতে ব্যবহার করি।

স্ক্রিপ্টটি কিছু মুছবে না তবে ফাইলগুলি মুছতে কমান্ডগুলি মুদ্রণ করবে।

mfilter.sh ./dir | bash

আশা করি এটা সাহায্য করবে


1

সদৃশ ফাইলগুলি সরানোর আরও সংক্ষিপ্ত সংস্করণ (কেবল একটি লাইন)

young@ubuntu-16:~/test$ md5sum `find ./ -type f` | sort -k1 | uniq -w32 -d | xargs rm -fv

find_same_size.sh

#!/usr/bin/env bash
#set -x
#This is small script can find same size of files.
find_same_size(){

if [[ -z $1 || ! -d $1 ]]
then
echo "Usage $0 directory_name" ;
 exit $?
else
dir_name=$1;
echo "current directory is $1"



for i in $(find $dir_name -type f); do
   ls -fl $i
done | awk '{f=""
        if(NF>9)for(i=9;i<=NF;i++)f=f?f" "$i:$i; else f=$9;
        if(a[$5]){ a[$5]=a[$5]"\n"f; b[$5]++;} else a[$5]=f} END{for(x     in b)print a[x] }' | xargs stat -c "%s  %n" #For just list files
 fi
   }

find_same_size $1


young@ubuntu-16:~/test$ bash find_same_size.sh tttt/ | awk '{ if($1 !~   /^([[:alpha:]])+/) print $2}' | xargs md5sum | uniq -w32 -d | xargs rm -vf

0

আমি একই কাজ সম্পাদন করার একটি সহজ উপায় খুঁজে পেয়েছি

for i in `md5sum * | sort -k1 | uniq -w32 -d|awk '{print $2}'`; do
rm -rf $i
done

0

ডিরেক্টরিতে প্রতিটি ফাইলের চেকসাম প্রক্রিয়া করার জন্য এবং সম্ভবত সমস্ত অবশিষ্ট উত্তরগুলি ভয়ঙ্করভাবে অক্ষম।

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


0

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

#! /bin/bash
# Warning: globstar excludes hidden directories.
# Turn on recursive globbing (in this script) or exit if the option is not supported:
shopt -s globstar || exit
for f in **
do
extension="${f##*.}"
#get only files with parentheses suffix
FILEWITHPAR=$( echo "${f%.*}".$extension | grep -o -P "(.*\([0-9]\)\..*)")
# print file to be possibly deleted
if [ -z "$FILEWITHPAR" ] ;then
:
else
echo "$FILEWITHPAR ident"
# identify if a similar file without suffix exists
FILENOPAR=$(echo $FILEWITHPAR | sed -e 's/^\(.*\)([0-9])\(.*\).*/\1\2/')
echo "$FILENOPAR exists?"
if [ -f "$FILENOPAR" ]; then
#delete file with suffix in parentheses
echo ""$FILEWITHPAR" to be deleted"
rm -Rf "$FILEWITHPAR"
else
echo "no"
fi
fi
done

-3

আমি একটি ছোট প্রোগ্রাম পেয়েছি যা সত্যিই এই ধরণের কাজগুলি সহজ করে তোলে : fdupes


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