查看目录中的文件列表

时间:2014-12-18 13:31:47

标签: regex perl

我想编写一个接收文件和目录路径的Perl脚本, 该目录包含指向其他目录的链接的文件。 我想逐个查看目录中的文件, 并且对于每个文件,在我的输入文件中搜索文件名,并将其替换为链接到

的地址

例如,如果脚本收到目录"/myworkspace/mydir" 它包含以下文件:

myfile1  ->  /myworkspace/globaldir/file1
myfile2  ->  /myworkspace/somedir/file2
myfile3  ->  /globalworkspace/file3

比以下输入文件:

 " cd /myworkspace/mydir/myfile1   
   cp -r /myworkspace/mydir/myfile2 /myworkspace/mydir/myfile3 "

我想得到以下输出:

" cd /myworkspace/globaldir/file1
  cp -r /myworkspace/somedir/file2 /globalworkspace/file3 "

这样做的有效方法是什么?

1 个答案:

答案 0 :(得分:2)

我使用Path::Tiny来处理绝对路径和路径连接。

#!/usr/bin/perl
use warnings;
use strict;

use Path::Tiny;

my $dir   = shift;
my $input = shift;

my %replace;

opendir my $DIR, $dir or die $!;
while (my $file = readdir $DIR) {
    $file = path($dir)->child($file)->absolute;
    $replace{$file} = readlink $file if -l $file;
}
close $DIR;

my $regex = join '|',
            map quotemeta,                   # To handle filenames containing "." etc.
            sort { length $b <=> length $a } # Not to replace parts of paths (process longer first).
            keys %replace;

open my $IN, '<', $input or die $!;
while (<$IN>) {
    s/($regex)/$replace{$1}/g;
    print
}