Encontre uma lista de arquivos que contém um conjunto de linhas consecutivas definidas em outro arquivo

1

Eu tenho um arquivo Reference que contém

a
b
c
d

Eu tenho que verificar todos os arquivos em uma subpasta recursivamente que contém todas as linhas do arquivo Reference consecutivamente e excluir esses arquivos.

Por exemplo, se um arquivo contiver:

y
z
a
b
c
d
w
1

, o arquivo deve ser excluído.

Mas, se um arquivo contiver

y
z
a
b
3
c
d
w
1
2

não deve ser excluído.

    
por Nikhil 23.09.2018 / 09:40

2 respostas

1

Tente:

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'" \;

substitua print '{}: can be deleted' por os.remove('{}') para excluir esse arquivo quando você estiver satisfeito com o resultado.

Relacionado:

por 23.09.2018 / 14:08
1

Se o uso do perl for uma opção, aqui está um pequeno script que faz o trabalho de um arquivo, ele meramente lê o arquivo de referência e de entrada, tenta substituir o padrão de referência pela string vazia. Se o tamanho for alterado, grava em arquivo. Chame-o com nomes de arquivos de referência e de entrada como argumentos de linha de comando.

#!/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";
}

Basta inserir a chamada em um loop de shell usando find - por exemplo - para operar no conteúdo do diretório.

    
por 23.09.2018 / 10:56