查找包含在另一个文件中定义的一组连续行的文件列表

查找包含在另一个文件中定义的一组连续行的文件列表

我有一个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 将调用插入到 shell 循环中 - 例如 - 即可对目录内容进行操作。

相关内容