需要一个Perl脚本来匹配目录中所有文件中的字符串,并将匹配的文件推送到新文件夹

时间:2012-09-18 09:45:18

标签: perl shell

我想要一个Perl脚本在上述目录中搜索并找到这些文件 其中包含字符串ADMITTING DX并将这些文件推送到新文件夹。

我是Perl的新手,正在尝试这个:

#!/usr/bin/perl

use strict;
use warnings;

use File::Find;

my $dir    = '/usr/share/uci_cmc/uci_new_files/';
my $string = 'ADMITTING DX';

open my $results, '>', '/home/debarshi/Desktop/results.txt'
    or die "Unable to open results file: $!";

find(\&printFile, $dir);

sub printFile {

    return unless -f and /\.txt$/;

    open my $fh, '<',, $_ or do {
        warn qq(Unable to open "$File::Find::name" for reading: $!);
        return;
    };

    while ($fh) {
        if (/\Q$string/) {
            print $results "$File::Find::name\n";
            return;
        }
    }
}

4 个答案:

答案 0 :(得分:2)

您正在从文件中读取行:

while ($fh)

应该是

while (<$fh>)

答案 1 :(得分:1)

你可以用Perl真正做到这一点,这是一个很好的方式。但是你的案例中没有任何复杂的文本处理,所以我只建议使用bash one-liner:

for f in *.txt; do grep 'ADMITTING DX' $f >/dev/null && mv $f /path/to/destination/; done

答案 2 :(得分:0)

如果您仍需要Perl解决方案:

perl -e 'for my $f (glob "*.txt") { open F, $f or die $!; while(<F>){ if(/ADMITTING DX/){ rename $f, "/path/to/destination/$f" or die $!; last } close $f; }}'

答案 3 :(得分:0)

您的代码中有两个错误。首先,open中的printFile来电中有一个多余的逗号。它应该读

open my $fh, '<', $_ or do { ... };

其次,您需要调用readline来从打开的文件中获取数据。您可以使用<$fh>执行此操作,因此while循环应为

while (<$fh>) { ... }

除此之外你的代码很好