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

You are reading the lines from the file as:

while ($fh)

which should be

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

あなたは本当にPerlでそれをすることができます、そしてそれは素晴らしい方法です。しかし、あなたの場合、複雑なテキスト処理はないので、bashワンライナーを使用することをお勧めします。

for f in *.txt; do grep 'ADMITTING DX' $f >/dev/null && mv $f /path/to/destination/; done
于 2012-09-18T09:55:56.373 に答える
0

コードに 2 つのエラーがあります。openまず、 の呼び出しに余分なコンマがありますprintFile。それは読むべきです

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

readline次に、開いているファイルからデータを取得するための呼び出しが必要です。でこれを行うことができる<$fh>ので、whileループは次のようになります

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

それを除けば、あなたのコードは問題ありません

于 2012-09-18T14:38:31.093 に答える
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 に答える