我要查找不包含特定字符串的文件? 列出的文件如下所示
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "delims=" %%G IN ('powershell -NoLogo -NoProfile -Command ^
"(Get-CIMInstance -ClassName Win32_LogicalDisk).DeviceID"') DO (
SET "VAR=%%G\somefolderpath"
IF EXIST "!VAR!" (
echo "!VAR!" found
) ELSE (
echo "!VAR!" not found
)
)
这是我的代码
../../../experiment/fileA.txt (contain word 'Book')
../../../experiment/fileB.txt (contain word 'Book')
../../../experiment/fileC.txt (do not contain word 'Book')
../../../experiment/fileD.txt (contain word 'Book')
但似乎不起作用。无论是否具有$ keyword,它都会显示所有文件。我只希望它仅在文件没有$ keyword
时显示答案 0 :(得分:5)
有一个简单的逻辑错误。代码遍历每个文件的行
while (<$in>) {
if (/\Q$keyword\E/){
next;
} else {
push @result, $F;
return;
}
}
任何一行没有$keyword
时,它将文件添加到@result
。
您需要检查所有行,如果仅从未找到$keyword
,请添加文件。最简单的方法是在找到东西后立即从子return
while (<$in>) {
return if /\Q$keyword/;
}
push @result, $F;
答案 1 :(得分:2)
这不能解决您的代码,但是我想指出的是,在任何Linux系统上使用grep
命令,您都可以执行与您尝试使用此命令类似的操作:
grep -L Book -R ../../../experiment/
答案 2 :(得分:1)
Path::Iterator::Rule使这样的任务非常简单。附带说明,我建议在迭代之前将目录解析为绝对路径。
use strict;
use warnings;
use Cwd 'abs_path';
use File::Basename;
use Path::Iterator::Rule;
my $dirname = abs_path "../../../experiment/";
my $keyword = "Book";
my $rule = Path::Iterator::Rule->new->not_dir->name(qr/txt$/)->not_line_match(qr/\Q$keyword\E/);
my $next = $rule->iter($dirname);
while (defined(my $file = $next->())) {
print basename($file), "\n";
}