如何使用Perl检查并删除符号链接(如果存在)?
if (-e "$ENV{MYHOME}/link") {
system("rm $ENV{MYHOME}/link");
}
这是用于检查符号链接是否存在的代码,如果存在,则将其删除。如何使用Perl检查并删除符号链接(如果存在)?
我正在跟踪此代码无法运行的错误。我目前还无法弄清楚,但是发生的情况是这段代码无法删除符号链接,从而导致文件存在错误。
我想检查这种技术是否存在一些根本缺陷?我还阅读了关于http://perldoc.perl.org/functions/unlink.html,但想知道目前的方法是否由于某种原因不被推荐?
只需使用的可能性:
if (-l "$ENV{MYHOME}/link") {
unlink "$ENV{MYHOME}/link"
or die "Failed to remove file $ENV{MYHOME}/link: $!\n";
}
如果取消链接失败时,它会说为什么。 -l
询问目标是否是链接。 -e
询问文件是否存在。如果你的链接是不存在的文件,它将返回false,你的代码将无法删除链接。
您的代码将只具有所运行用户的权限。这个符号链接是否可能由另一个用户拥有,而且不可写?
而且,总是有$ ENV {} MYHOME不包含你所想象的那样......
是的,这是我正在研究的一种可能性,这是可能的,但不应该发生。 – Lazer 2012-01-31 03:36:11
顺便说一下,取消链接的效率要高得多,因为您不会分叉另一个进程。另外,我不知道你的系统负载有多重或发生的频率如何,但分叉这样的系统调用会打开类似于你的pid表的内容充满并且无法分叉的可能性。 – 2012-01-31 04:03:52
各个操作系统都有自己的errno.h
。我会用Errno.pm
来处理每个错误。
use Errno;
use File::Spec;
my $dir = File::Spec->catfile($ENV{MYHOME}, 'link');
if (!unlink $dir) {
if ($! == Errno::ENOENT) {
die "Failed to remove '$dir'. File doesn't exist:$!";
}
}
确实'-l'检查文件是符号链接还是硬链接?或两者? – mask8 2014-06-06 06:15:03
@ mask8 - “-l”如果路径是符号链接,则返回true。硬链接文件显示为常规文件,唯一不同的是它们的链接数(来自stat的st_nlink)大于1。目录不能在Linux/Unix中被硬链接。 – unpythonic 2018-01-26 00:51:39