我有一个脚本,它创建一个新目录,然后遍历不同(源)目录的所有内容,并在新目录中为源目录中的每个元素创建链接。脚本的相关部分是:
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
只检查文件是否存在,无论它链接到哪里?
答案 0 :(得分:3)
将符号链接计为"现有"如果存在,无论它指向的文件是否也存在,您都可以这样做:
(-e "$newdir/$entry" || -l "$newdir/$entry")
如果指定的文件是符号链接,则-l
测试返回true,并且不关心它链接的位置。但是对于任何不是符号链接的内容,它都会返回false,因此您仍需要-e
来处理其他类型的文件。