查找不包含特定字符串的文件

时间:2019-07-01 02:43:57

标签: perl

我要查找不包含特定字符串的文件? 列出的文件如下所示

@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

时显示

3 个答案:

答案 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";
}