首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检测Perl中的符号链接被破坏?

如何检测Perl中的符号链接被破坏?
EN

Stack Overflow用户
提问于 2011-07-05 09:46:51
回答 5查看 7.1K关注 0票数 8

我想使用Perl删除目录中一个破损的符号链接。

在我看来,我只需列出目录的文件,并测试这是一个符号链接(-l),如果它返回false,只需将其解链接即可。

但是,当使用readir列出所有文件时,我损坏的符号链接似乎不会被重新命名为文件。因为我的链接没有指向任何东西,我明白为什么。

然后:如何检测Perl中的符号链接是否被破坏?

谢谢,

更新

$myDir中的所有文件都是符号链接,有效或损坏。当我显示@文件时,我只得到一个有效的符号链接列表。

代码语言:javascript
运行
复制
opendir DIR, $myDir;
my @files = grep(/$regexp/,readdir(DIR));
closedir DIR;
print "filenames : @files\n";
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-05 10:01:53

有两个主要的相关系统调用,stat() and lstat()lstat()调用将告诉您它是一个符号链接(但在其他文件上,行为与stat()相同)。这使您可以确定名称是符号链接。stat()系统调用跟踪一个符号链接到它的末尾,并告诉您链接末尾的文件(或目录)。如果符号链接上的stat()调用失败,则符号链接被破坏,或者您试图访问没有权限的目录或文件。

Perl file test运算符包括-l以检测名称是否是符号链接。您可以显式地使用Perl函数statlstat。在这两者之间,您应该能够分辨出符号链接是否中断--但是您可能应该计划编写一个函数来完成这项工作。

您可能不需要使用readlink Perl函数。小心底层系统readlink()调用;它不会返回以空结尾的字符串!

有趣的是,Perl及其POSIX模块都不支持realpath()函数。但是,PathTools模块确实支持它。如果realpath失败,则在符号链接上,符号链接是非功能性的(也称为断开的)。

票数 9
EN

Stack Overflow用户

发布于 2011-07-05 10:00:18

下面是我用来删除坏链接的一些代码:

代码语言:javascript
运行
复制
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;

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

票数 4
EN

Stack Overflow用户

发布于 2011-07-05 10:00:24

检查是否有损坏的符号链接(如果有指向符号链接的符号链接,则只检查顶层):

代码语言:javascript
运行
复制
use strict;
use warnings;
use autodie;
opendir my $dirh, '.';
while (my $file = readdir $dirh) {
    if ( -l $file ) {
        my $target = readlink $file;
        if ( ! -e $target && ! -l $target ) {
            print "$file -> $target broken\n";
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6580721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档