2017-12-05 5 views
0

아래의 쉘 스크립트를 개발하여 파일 이름의 중복 된 부분을 찾아서 삭제했습니다. 마찬가지로 Perl 스크립트 텍스트 처리에는 시간이 덜 걸리기 때문에 Perl 스크립트를 준비해야합니다.중복 된 파일 이름에 Perl 스크립트 도움말이 필요합니다

#!/bin/bash 
for i in `ls -t *xml|awk 'BEGIN{FS="_"}{if (++dup[$1] >= 2) print}'`; 
do 
rm $i 
done 

내가

File 1: AAA_555_0000 
File 2: AAAA_123_123 
File 3: AAAA_452_452 [latest] 

File 4: BBB_555_0000 
File 5: BBB_555_555 
File 6: BBB_999_999 [latest] 

File 7: CCC_555_0000 
File 8: CCC_000_000 
File 9: CCC_000_111 [latest] 

펄 스크립트는 모든 파일 이름 패턴에서 최신 파일을 선택하는 예를 들어 단지 최근 수정 된 파일 이름 패턴을 가지고 같은 방법으로 내 펄 스크립트 내 코드를 준비해야는 (부품을 의미한다 파일 이름)을 비교하고 중복을 삭제해야합니다. 예를 들어, 스크립트는 AAA 파일 이름 패턴에서 최신 파일을 선택해야하며 패턴이 발견되면 삭제해야하는 다른 AAA 패턴과 비교해야합니다. 결국 모든 파일 이름 패턴의 최신 파일 만 남아 있어야합니다.

이 논리를 도와 주시면 감사하겠습니다.

감사합니다.

+4

"_the 파일명 패턴 _"은 무엇입니까? 처음으로 3 개의 동등한 문자? 아니면 'A'로 시작하는 사람들, 'B'로 시작하는 사람들 ...? 설명을 추가하기 위해 질문을 수정하십시오. – zdim

+0

답장을 보내 셨습니다. 그게 내가 awk에서 필드 구분 기호를 사용하여 쉘 스크립트에서 한 일은 파일 이름의 일부가되고 다른 파일 이름과 비교됩니다. – misterbean2

+0

"중복 부품"이란 동일 또는 일부 부품의 앞부분을 의미합니까? "AAA_555_0000", "BBB_555_0000"및 "CCC_555_0000"에는 중복 부품이 있습니다. – shawnhcorey

답변

0

당신의 파일의 순서를 어떻게 결정하여 파일이 더 새로운 것인지 알 수 없기 때문에 귀하의 질문이 약간 불분명합니다. 이 코드는 당신이 필요로하는 무슨 생각을 할 것입니다 :

my $dir = shift || '.'; 

opendir(my $dh, $dir); 
my @files = sort grep !/^\./, readdir($dh); 

my $last; 
my @batch; 
foreach my $f (@files) { 
    my @parts = split /_/, $f; 

    if(!$last) { 
    $last = $parts[0]; 
    push @batch, [ @parts ]; 
    } 
    elsif(index($last, $parts[0]) != -1) { 
    push @batch, [ @parts ]; 
    } 
    else { 
    delete_files(@batch); 

    @batch = ([ @parts ]); 
    $last = $parts[0]; 
    } 
} 
delete_files(@batch); 

sub delete_files { 
    my @batch = @_; 

    @batch = sort { 
    $a->[0] cmp $b->[0] || 
    $a->[1] cmp $b->[1] || 
    $a->[2] cmp $b->[2] 
    } @batch; 
    pop @batch; 

    map { print "Delete: ", join('_', @$_), "\n"; } @batch; 
} 

이 파일의 배치이 파일 ('_'문자 첫까지) 같은 접두어가있는 한 것으로 가정합니다. 2 개의 접두어가 다른 길이를 가질 때, 공통 길이는 일치해야합니다.

또한 "버전 번호"(텍스트 비트를 '_'로 구분)를 비교해야하며 가장 왼쪽이 가장 중요하다고 가정합니다. 이러한 전제 코드 감안할 때

, 당신이 언급 파일, 출력을 디렉토리에 지적 ... 당신이 파일 (7)가 최신이 아니라고 생각하는 이유

# latest.pl <dir> 
Delete: AAA_555_0000 
Delete: AAAA_123_123 
Delete: BBB_555_0000 
Delete: BBB_555_555 
Delete: CCC_000_000 
Delete: CCC_000_111 

불분명 한 부분이

map { print "Delete: ", join('_', @$_), "\n"; } @batch; 

으로 :

순서가 명확한 경우

, 당신은 라인을 변경할 수 있습니다

파일을 삭제합니다.

삭제할 파일을 결정하는 sub의 정렬 방법으로 재생할 수 있습니다. 이제 파일 이름 부분을 왼쪽에서 오른쪽으로 문자열로 비교합니다. 필요한 경우 대신 <=>을 사용하여 숫자로 비교할 수 있습니다.

+0

고마워요, 완벽하게 작동합니다. – misterbean2

+1

문제 없습니다. 대답이 정확하다고 생각되면 투표에 투표하고 올바른 것으로 표시하는 것이 좋습니다. –

관련 문제