如何在Perl哈希中表示文件系统的符号链接?
发布时间:2020-12-15 21:50:08 所属栏目:大数据 来源:网络整理
导读:在服务器故障,How to list symbolic link chains?(不是我的问题)谈论列出所有符号链接并跟随它们.为了使这个可行,我们首先考虑一个目录. 我想写一个实用程序的简短实用程序.将符号链接中的对放入哈希中然后处理哈希看起来很容易. 但后来我可能有类似的东西:
在服务器故障,How to list symbolic link chains?(不是我的问题)谈论列出所有符号链接并跟随它们.为了使这个可行,我们首先考虑一个目录.
我想写一个实用程序的简短实用程序.将符号链接中的对放入哈希中然后处理哈希看起来很容易. 但后来我可能有类似的东西: ls -l total 0 lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:03 c -> a lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:17 trap -> b lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:17 x -> y lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:17 y -> b 很明显a-> b-> c是一个循环,并且该陷阱指向一个循环,但要知道x指向一个循环,我需要跟随一点. 一个哈希表示是: a => b b => c c => a trap => b x => y y => b 但是一旦我知道循环是什么,反向表示更好地将循环标记为坏起点. 所以这里有一些问题: >哈希是表示符号链接的最佳结构吗? 解决方法
您可以在CPAN上使用
Graph模块,如下所示:
#! /usr/bin/perl use warnings; use strict; use Graph; my $g = Graph->new; my $dir = @ARGV ? shift : "."; opendir my $dh,$dir or die "$0: opendir $dir: $!"; while (defined(my $name = readdir $dh)) { my $path = $dir . "/" . $name; if (-l $path) { my $dest = readlink $path; die "$0: readlink $path: $!" unless defined $dest; $g->add_edge($name => $dest); } else { $g->add_vertex($name); } } my @cycle = $g->find_a_cycle; if (@cycle) { $" = ' -> '; #" # highlighting error print "$0: $dir: at least one cycle: @cyclen"; } else { print "$0: $dir: no cyclesn"; } 例如,在与您的问题中的结构类似的目录中,输出是 $../has-cycle ../has-cycle: .: at least one cycle: c -> a -> b (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |