如何检测Perl中的符号链接是否已损坏?

Spr*_*dzy 8 linux perl symlink

我想使用Perl删除目录中损坏的符号链接.

在我看来,我只需要列出目录的文件,测试是一个符号链接(-l),如果它返回false只是取消链接.

但似乎当使用readir列出所有文件时,我的破坏的符号链接不会被识别为文件.因为我的链接指向什么,我理解为什么.

那么:我如何检测Perl中的符号链接是否被破坏?

谢谢,

UPDATE

符号链接中的所有文件都是符号链接,无论是有效还是损坏.当我显示@files时,我只获得一个有效的符号链接列表.

opendir DIR, $myDir;
my @files = grep(/$regexp/,readdir(DIR));
closedir DIR;
print "filenames : @files\n";
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 8

有两个主要的相关系统调用,stat()lstat().该lstat()调用将告诉您它是一个符号链接(但在其他文件上,行为相同stat()).这允许您确定该名称是符号链接.该stat()系统调用遵循符号链接到结束,并在链路的末端告诉你有关的文件(或目录).如果stat()符号链接上的调用失败,则符号链接中断或您尝试访问您没有权限的目录或文件.

Perl 文件测试运算符包括-l检测名称是否为符号链接.您可以使用Perl的功能statlstat明确.在这些之间,你应该能够弄清楚符号链接是否被破坏 - 但你应该计划编写一个函数来完成这项工作.

您可能不需要使用readlinkPerl函数.注意底层系统readlink()调用; 它不会返回以null结尾的字符串!

有趣的是,Perl及其POSIX模块都不支持该realpath()功能.但是,PathTools模块确实支持它.如果realpath失败,则在符号链接上,符号链接无效(也称为已损坏).


cjm*_*cjm 6

这是我用来删除损坏的链接的一些代码:

chdir $dir        or die;
opendir(DIR, '.') or die;

foreach my $link (readdir DIR) {
  next unless -l $link and not -e readlink($link);

  print "Removing broken link $link\n";
  unlink $link;
}

closedir DIR;
Run Code Online (Sandbox Code Playgroud)

请注意,包含链接的目录是当前目录,这一点很重要。 readdir仅返回文件名,并且链接可能是相对的。


sal*_*lva 6

结合lstat使用stat:

say "dangling link at $fn" if (lstat $fn and not stat $fn);
Run Code Online (Sandbox Code Playgroud)

更新:它适合我...

salva@topo:~/t/dl$ perl -E 'opendir $dh, "."; say $_ for grep { !stat $_ and lstat $_ } readdir $dh'
foo
salva@topo:~/t/dl$ ls -l
total 0
-rw-rw-r-- 1 salva salva  0 2011-07-05 12:34 f
lrwxrwxrwx 1 salva salva 11 2011-07-05 12:00 fii -> /etc/shadow
lrwxrwxrwx 1 salva salva 12 2011-07-05 11:59 foo -> /etc/hjdkshf
Run Code Online (Sandbox Code Playgroud)