다른 파일에 정의된 연속된 행 집합을 포함하는 파일 목록 찾기

다른 파일에 정의된 연속된 행 집합을 포함하는 파일 목록 찾기

Reference다음 이 포함된 파일이 있습니다.

a
b
c
d

Reference모든 파일 행이 연속적으로 포함된 하위 폴더의 모든 파일을 재귀적으로 확인 하고 해당 파일을 삭제해야 합니다.

예를 들어, 파일에 다음이 포함되어 있는 경우:

y
z
a
b
c
d
w
1

, 파일을 삭제해야 합니다.

그러나 파일에 다음이 포함되어 있는 경우

y
z
a
b
3
c
d
w
1
2

삭제하면 안 됩니다.

답변1

노력하다:

find /path/to -type f ! -name 'reference_file' -exec python -c "import os;
if (open('/path/to/reference_file').read() in open('{}').read()): print '{}: can be deleted'" \;

결과가 만족스러우면 print '{}: can be deleted'파일을 삭제하여 교체하세요.os.remove('{}')

관련된:

답변2

Perl을 사용하는 것이 옵션인 경우 파일 작업을 수행하는 작은 스크립트가 있습니다. 참조 및 입력 파일을 읽고 참조 패턴을 빈 문자열로 바꾸려고 시도합니다. 크기가 변경되면 출력 파일이 기록됩니다. 참조 및 입력 파일 이름을 명령줄 인수로 사용하여 호출합니다.

#!/bin/perl 

sub readfile {
  my ($filename) = @_;
  my $content;
  open(my $fh, '<', $filename) or die "cannot open file $filename"; {
    local $/;
    $content = <$fh>;
  }
  close($fh);
    return $content;
}

sub writefile {
  my ($filename, $content) = @_;
  open(my $fh, '>', $filename) or die "cannot open file for writing: $filename"; {
    print $fh $content;
  }
  close($fh);
}

my $txtref = readfile($ARGV[0]);
my $txtin = readfile($ARGV[1]);

my $txtout = $txtin;
$txtout =~ s/$txtref//g;

if (length($txtin) ne length($txtout)) {
    print STDOUT "changes, length ".length($txtin)." => ".length($txtout)."\n";
    my $outf = $ARGV[1].".out";
  writefile($outf, $txtout);
} else {
    print STDOUT "no changes\n";
}

예를 들어 디렉토리 내용에 대해 작업하려면 find를 사용하여 쉘 루프에 호출을 삽입하십시오.

관련 정보