Awk

查找包含在另一個文件中定義的一組連續行的文件列表

  • September 23, 2018

我有一個Reference文件包含

a
b
c
d

我必須遞歸地檢查包含所有文件行的子文件夾中的所有Reference文件並刪除這些文件。

例如,如果一個文件包含:

y
z
a
b
c
d
w
1

,該文件應該被刪除。

但是,如果一個文件包含

y
z
a
b
3
c
d
w
1
2

它不應該被刪除。

嘗試:

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('{}')

有關的:

如果使用 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 循環中 - 例如 - 即可對目錄內容進行操作。

引用自:https://unix.stackexchange.com/questions/470822