이름은 같지만 내용이 다른 파일을 찾으십니까?


9

다음과 같은 파일 목록을 생성하고 싶습니다.

  • 같은 이름
  • 다른 내용

디렉토리 (모든 하위 디렉토리 및 내용 포함)

수행하는 방법? 배쉬, 펄, 뭐든지 괜찮아

따라서 이름과 내용이 같은 두 파일이 표시되지 않아야합니다.


이름이 같은 파일이 3 개 있고 그 중 2 개가 동일하다고 가정 해보십시오.
Kyle Jones

@KyleJones : "같은 이름을 가진 세 파일과 세 파일 중 두 파일이 동일합니다">이 파일 이름을 목록에 추가해야합니다.
Nicolas Raoul

답변:


8

업데이트 : 스크립트의 오타를 수정 : 변경 print $NFprint $3; 또한 정리하고 의견을 추가했습니다.

파일 이름 에을 포함하지 않는다고 가정하면 \n다음 은 고유 하고 고유 한 섹션 제어 구분 과 같이 정렬 된 목록을 인쇄 하고 해당 파일 경로 그룹을 표시합니다. file namemd5sum

#!/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

다음은 Perl 스크립트입니다. 검색하려는 트리 상단의 디렉토리에서 실행하십시오. 스크립트에 의존 find하고 md5있지만, 후자로 대체 될 수있다 sha1, sum또는하여 stdin에 입력을 받아 표준 출력에 대한 해시를 출력하는 다른 파일 해시 프로그램.

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" } 

} '

fslint-gui스크립트 전에 모든 중복 항목을 지우는 데 사용 하기 때문에 md5sum이 필요하지 않습니다 .


내 Mac에서 이것은 동일한 이름의 동일한 내용의 중복 파일을 보여줍니다
nightograph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.