1

我想要一个 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

4 回答 4

2

您正在读取文件中的行:

while ($fh)

应该是

while (<$fh>)
于 2012-09-18T09:51:31.767 回答
1

你真的可以用 Perl 做到这一点,这是一个很好的方法。但是在您的情况下没有任何复杂的文本处理,所以我建议使用 bash one-liner:

for f in *.txt; do grep 'ADMITTING DX' $f >/dev/null && mv $f /path/to/destination/; done
于 2012-09-18T09:55:56.373 回答
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; }}'
于 2012-09-18T10:08:13.810 回答
0

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

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

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

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

除此之外,您的代码很好

于 2012-09-18T14:38:31.093 回答