1. 程式人生 > >perl 遍歷指定目錄下的所有文件,替換指定文本內容,返回受影響的文件路徑

perl 遍歷指定目錄下的所有文件,替換指定文本內容,返回受影響的文件路徑

change argv 文件路徑 () 關鍵字 ror $nf pen elsif

不會讀取 影藏文件

main

#!/usr/bin/perl
my ($path, $rp) = @ARGV;

sub search_file{
    my ($fname, $rp) = @_; # 獲取操作文件名 和 查詢的正則
    my ($o) = split("/", $rp);
    open(of, "<$fname") or die "$fname 文件打開失敗!$!";
    while(<of>){
        chomp;
        if($_ =~ /$o/){
            print "$fname\n";
            return 1;
        }
    }
    return 0;
}

sub change_file{
    my ($fname, $rp) = @_; # 獲取操作文件名 和 替換的正則
    if( !search_file($fname, $rp) ){ # 不存在關鍵字直接返回
       return 0;
    }

    my @data = ();
    my ($o, $n) = split("/", $rp);
    open(of, "<$fname") or die "$fname 文件打開失敗!$!";
    while(<of>){
        chomp;
        $_ =~ s/$o/$n/;
        push @data, "$_\n";
    }

    chomp @data; # 砍掉最後的 \n
    open(wf, "+>$fname") or die "Error: 文件$nfname打開失敗$!";
    print wf @data;
    return 1;
}

my @change_files = (); # 受到影響的文件

sub scan_file{
    my @files = glob(@_[0]);
    foreach (@files){
        if(-d $_){
            my $path = "$_/*";
            scan_file($path);
        }elsif(-f $_){
            if( change_file($_, $rp) ){
                push @change_files, $_;
            }
        }
    }
}

scan_file($path);

執行

讀取文本, world替換為ajanwu

λ perl main "./test/*" world/ajanuw
./test/dist/bundle.html
./test/src/index.html

讀取指定類型文件

修改下 scan_file 函數

my $path = "./test/*";
my @suffix_names = qw[.css .html];

sub scan_file{
    my @files = glob(@_[0]);
    foreach (@files){
        if(-d $_){
            my $path = "$_/*";
            scan_file($path);
        }elsif(-f $_){
           my $fname = $_;
           foreach (@suffix_names){
               if($fname =~ m/$_$/){
                   print "$fname\n";
               }
           }
        }
    }
}

scan_file($path);

perl 遍歷指定目錄下的所有文件,替換指定文本內容,返回受影響的文件路徑