একই নামের সাথে পৃথক সামগ্রী যুক্ত ফাইলগুলি সন্ধান করবেন?


9

আমি ফাইলগুলির একটি তালিকা তৈরি করতে চাই:

  • একই নাম
  • বিভিন্ন বিষয়বস্তু

একটি ডিরেক্টরিতে (সমস্ত শিশু ডিরেক্টরি এবং সামগ্রী সহ)

কিভাবে করবেন? বাশ, পার্ল, কিছু ঠিক আছে।

সুতরাং, একই নাম এবং একই বিষয়বস্তু সহ দুটি ফাইল প্রদর্শিত হবে না।


মনে করুন একই নামের তিনটি ফাইল রয়েছে এবং তিনটির মধ্যে দু'টি একরকম?
কাইল জোন্স

@ কাইলজোনস: "একই নামের তিনটি ফাইল এবং তিনটির মধ্যে দুটি অভিন্ন"> তারপরে এই ফাইলের নামটি তালিকায় যুক্ত করা উচিত
নিকোলাস রাউল

উত্তর:


8

আপডেট করুন: লিপিতে একটি টাইপো সংশোধন: পরিবর্তিত print $NFকরতে print $3; কিছু পরিষ্কার করে দিয়েছি এবং কিছু মন্তব্য যুক্ত করেছি।

ধরে নিচ্ছি যে ফাইলের নাম নেই \n, নিম্নলিখিতটি একটি সাজানো তালিকা প্রিন্ট করে যা বিরতি দেয় (যেমন: বিভাগ নিয়ন্ত্রণ বিরতিগুলি ) অনন্য file name, অনন্য md5sum, এবং ফাইল পাথের সম্পর্কিত গ্রুপটি দেখায়।

#!/bin/bash

# Choose which script to use for the final awk step 
out_script=out_all

# Print all duplicated file names, even when md5sum is the same 
out_all='{ if( p1 != $1 ) { print nl $1; print I $2 }
      else if( p2 != $2 ) { print I $2 }
      print I I $3; p1=$1; p2=$2; nl="\n" }
   END { printf nl}'

# Print only duplicated file names which have multiple md5sums.
out_only='{ if( p1 != $1 ) { if( multi ) { print pend }
                             multi=0; pend=$1 "\n" I $2 "\n" }
       else if( p2 != $2 ) { multi++; pend=pend I $2 "\n" } 
       pend=pend I I $3 "\n"; p1=$1; p2=$2 } 
   END { if( multi ) print pend }'

# The main pipeline 
find "${1:-.}" -type f -name '*' |  # awk for duplicate names
awk -F/ '{ if( name[$NF] ) { dname[$NF]++ }
           name[$NF]=name[$NF] $0 "\n" } 
     END { for( d in dname ) { printf name[d] } 
   }' |                             # standard md5sum output 
xargs -d'\n' md5sum |               # " "==text, "*"==binary
sed 's/ [ *]/\x00/' |               # prefix with file name  
awk -F/ '{ print $3 "\x00" $0 }' |  # sort by name. md5sum, path 
sort |                              # awk to print result
awk -F"\x00" -v"I=   " "${!out_script}"

একাধিক গুলি সহ কেবলমাত্র ফাইলের নাম দেখানো আউটপুট md5

afile.html
   53232474d80cf50b606069a821374a0a
      ./test/afile.html
      ./test/dir.svn/afile.html
   6b1b4b5b7aa12cdbcc72a16215990417
      ./test/dir.svn/dir.show/afile.html

আউটপুট একই নামে সমস্ত ফাইল দেখাচ্ছে ।

afile.html
   53232474d80cf50b606069a821374a0a
      ./test/afile.html
      ./test/dir.svn/afile.html
   6b1b4b5b7aa12cdbcc72a16215990417
      ./test/dir.svn/dir.show/afile.html

fi    le.html
   53232474d80cf50b606069a821374a0a
      ./test/dir.svn/dir.show/fi    le.html
      ./test/dir.svn/dir.svn/fi    le.html

file.html
   53232474d80cf50b606069a821374a0a
      ./test/dir.show/dir.show/file.html
      ./test/dir.show/dir.svn/file.html

file.svn
   53232474d80cf50b606069a821374a0a
      ./test/dir.show/dir.show/file.svn
      ./test/dir.show/dir.svn/file.svn
      ./test/dir.svn/dir.show/file.svn
      ./test/dir.svn/dir.svn/file.svn

file.txt
   53232474d80cf50b606069a821374a0a
      ./test/dir.show/dir.show/file.txt
      ./test/dir.show/dir.svn/file.txt
      ./test/dir.svn/dir.show/file.txt
      ./test/dir.svn/dir.svn/file.txt

1

এখানে একটি পার্ল স্ক্রিপ্ট। আপনি যে গাছটি অনুসন্ধান করতে চান তার উপরে ডিরেক্টরিতে এটি চালান। স্ক্রিপ্টটি উপর নির্ভর করে findএবং md5তবে এরপরের অংশটি প্রতিস্থাপন করা যেতে পারে sha1, sumবা অন্য কোনও ফাইল হ্যাশিং প্রোগ্রাম যা স্টিডিনে ইনপুট গ্রহণ করে এবং স্ট্যাডআউটে একটি হ্যাশ আউটপুট করে।

use strict;

my %files;
my %nfiles;
my $HASHER = 'md5';

sub
print_array
{
    for my $x (@_) {
        print "$x\n";
    }
}

open FINDOUTPUT, "find . -type f -print|" or die "find";

while (defined (my $line = <FINDOUTPUT>)) {
    chomp $line;
    my @segments = split /\//, $line;
    my $shortname = pop @segments;
    push @{ $files{$shortname} }, $line;
    $nfiles{$shortname}++;
}

for my $shortname (keys %files) {
    if ($nfiles{$shortname} < 2) {
        print_array @{ $files{$shortname} };
        next;
    }
    my %nhashes;
    my %revhashes;
    for my $file (@{ $files{$shortname} }) {
        my $hash = `$HASHER < $file`;
        $revhashes{$hash} = $file;
        $nhashes{$hash}++;
    }
    for my $hash (keys %nhashes) {
        if ($nhashes{$hash} < 2) {
            my $file = $revhashes{$hash};
            print "$file\n";
        }
    }
}


1

যারা শুধুমাত্র ফাইলের নামের একটি তালিকা দেখতে চান জন্য, এখানে প্রাসঙ্গিক অংশ Peter.O এর উত্তর :

find "${1:-.}" -type f -name '*' | 
awk -F/ '{ if( name[$NF] ) { dname[$NF]++ }
       name[$NF]=name[$NF] $0 "\n" } 
 END { for( d in dname ) { printf name[d] "\n" } 

} '

আমার md5sums দরকার নেই কারণ আমি fslint-guiসমস্ত নকল মুছে ফেলার জন্য স্ক্রিপ্টের আগে ব্যবহার করি ।


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