Awk
查找包含在另一個文件中定義的一組連續行的文件列表
我有一個
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 循環中 - 例如 - 即可對目錄內容進行操作。