我想要一个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;
}
}
}
答案 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>) { ... }
除此之外你的代码很好