linux - 我如何检测 Perl 中的符号链接(symbolic link)已损坏?

标签 linux perl symlink

我想使用 Perl 删除目录中损坏的符号链接(symbolic link)。

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

但似乎在使用 readir 列出所有文件时,我损坏的符号链接(symbolic link)没有被识别为文件。因为我的链接没有指向任何内容,所以我明白为什么。

然后:如何检测 Perl 中的符号链接(symbolic link)是否损坏?

谢谢,

更新

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

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

最佳答案

有两个主要的相关系统调用,stat() and lstat() . lstat() 调用会告诉您它是一个符号链接(symbolic link)(但在其他文件上,其行为与 stat() 相同)。这使您可以确定该名称是一个符号链接(symbolic link)。 stat() 系统调用在符号链接(symbolic link)之后结束,并在链接末尾告诉您有关文件(或目录)的信息。如果 stat() 对符号链接(symbolic link)的调用失败,则说明符号链接(symbolic link)已损坏,或者您正在尝试访问您没有权限的目录或文件。

Perl file test运算符包括 -l 以检测名称是否为符号链接(symbolic link)。您可以使用 Perl 函数 statlstat明确地。在这两者之间,您应该能够弄清楚符号链接(symbolic link)是否损坏 - 但您可能应该计划编写一个函数来完成这项工作。

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

有趣的是,Perl 及其 POSIX 模块都不支持 realpath()功能。然而,PathTools模块确实支持它。如果 realpath 在符号链接(symbolic link)上失败,则符号链接(symbolic link)不起作用(也称为损坏)。

关于linux - 我如何检测 Perl 中的符号链接(symbolic link)已损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6580721/

相关文章:

php - Laravel 5.2 - 如何通过 Modal/Controller 运行 shell 命令

linux - 如何使用 cmake 为 jsoncpp 0.10.7 指定共享库的安装目录?

git - Go:无法在符号链接(symbolic link)中打包

linux - Wordpress 使用符号链接(symbolic link)共享核心目录

perl - 我在哪里可以找到 HTTP::Server::Simple 中的请求正文

unix - 如何使用 maven 解压缩符号链接(symbolic link)?

r - 无法在 Ubuntu 20.04 上的 Rstudio 中加载已安装的软件包 : sh: 1: make: not found

c++ - makefile 以及针对 Linux 程序和 C++ 使用 eclipse

perl - 欢快的 : syntax-highlighting for inlined templates

perl - 大致检查 Perl 代码的语法,比 perl -c 快