Perl -e文件测试不识别死链接

时间:2014-12-07 14:02:45

标签: perl

我有一个脚本,它创建一个新目录,然后遍历不同(源)目录的所有内容,并在新目录中为源目录中的每个元素创建链接。脚本的相关部分是:

use strict;
use warnings;
use Getopt::Long;
use Cwd 'getcwd';
use Cwd 'realpath';
#...
opendir ($LC, $source_dir) or die "Cannot open directory: '$source_dir': $!";

while ($entry = readdir $LC) {
    next if $entry =~ /\A\.\.?\z/;
    print "-I- Creating a link $entry\n";
    system "ln -s ".realpath("${source_dir}/${entry}")." ${new_dir}/$entry";
    die "-E- couldn't create link ${new_dir}/$entry ... exiting.\n" unless -e "${new_dir}/$entry";
}

closedir $LC;
#...

当源目录中的一个文件是死链接时,会出现问题。命令ln在新目录中创建一个名为/new_dir/dead_link的文件,它链接到/source_dir/deal_link,但由于/source_dir/deal_link链接到非现有文件,-e命令将/source_dir/deal_link识别为不存在,并调用die命令。

正在运行ls -ltr /new_dir/dead link

lrwxrwxrwx 1 user ttt 44 Dec  7 07:40 /new_dir/dead_link -> /source_dir/dead_link

我该怎么做-e只检查文件是否存在,无论它链接到哪里?

1 个答案:

答案 0 :(得分:3)

将符号链接计为"现有"如果存在,无论它指向的文件是否也存在,您都可以这样做:

(-e "$newdir/$entry" || -l "$newdir/$entry")

如果指定的文件是符号链接,则-l测试返回true,并且不关心它链接的位置。但是对于任何不是符号链接的内容,它都会返回false,因此您仍需要-e来处理其他类型的文件。