我正在编写代码来查找不包含字符串模式的文件。如果我有一个文件列表,我必须查看每个文件的内容,如果字符串模式“clean”没有出现在文件中,我想获取文件名。请帮忙。
以下是该方案: 我有一个文件列表,每个文件里面都有很多行。如果文件是干净的,它将具有“干净”的措辞。但是如果文件很脏,则“干净”的措辞不存在,并且没有明确的指示告诉文件是脏的。所以只要在每个文件里面,如果没有检测到“干净”的措辞,我会把它归类为脏文件,我想跟踪文件名
答案 0 :(得分:4)
您可以使用简单的单行:
perl -0777 -nlwE 'say $ARGV if !/clean/i' *.txt
使用-0777
对文件进行slurping,对整个文件进行正则表达式检查。如果未找到匹配项,我们将打印文件名。
对于不支持-E
的低于5.10的perl版本,您可以将-E
替换为-e
,将say $ARGV
替换为print "$ARGV"
。
perl -0777 -nlwe 'print "$ARGV\n" if !/clean/i' *.txt
答案 1 :(得分:2)
如果您需要在Perl中生成列表,File::Finder
模块将简化生活。
未经测试,但应该有效:
use File::Finder;
my @wanted = File::Finder # finds all ..
->type( 'f' ) # .. files ..
->name( '*.txt' ) # .. ending in .txt ..
->in( '.' ) # .. in current dir ..
->not # .. that do not ..
->contains( qr/clean/ ); # .. contain "clean"
print $_, "\n" for @wanted;
整洁的东西!
编辑:
现在我对问题有了更清楚的了解,我认为这里不需要任何模块:
use strict;
use warnings;
my @files = glob '*.txt'; # Dirty & clean laundry
my @dirty;
foreach my $file ( @files ) { # For each file ...
local $/ = undef; # Slurps the file in
open my $fh, $file or die $!;
unless ( <$fh> =~ /clean/ ) { # if the file isn't clean ..
push @dirty, $file; # .. it's dirty
}
close $fh;
}
print $_, "\n" for @dirty; # Dirty laundry list
获得机制后,可以将其简化为la grep
等等。
答案 2 :(得分:0)
#!/usr/bin/perl
use strict;
use warnings;
open(FILE,"<file_list_file>");
while(<FILE>)
{
my $flag=0;
my $filename=$_;
open(TMPFILE,"$_");
while(<TMPFILE>)
{
$flag=1 if(/<your_string>/);
}
close(TMPFILE);
if(!$flag)
{
print $filename;
}
}
close(FILE);
答案 3 :(得分:0)
这样的一种方式:
ls *.txt | grep -v "$(grep -l clean *.txt)"