2010-11-09 78 views

回答

7

没有遍历文件系统寻找所有的符号链接,然后检查它们的目的地,没有。但是,如果你仍然要做到这一点,这是很直接:

use strict; 
use warnings; 
use File::Find; 

my $target = 'the filename you want to find links to'; 
finddepth(
    sub { 
     return if not -l $File::Find::name; 
     print "found $File::Find::name!\n" if readlink($File::Find::name) eq $target; 
    }, 
    '/' 
); 
+0

谢谢,我希望避免扫描整个文件系统,但我很感激代码:-) – Eric 2010-11-09 22:34:04

4

不是没有走文件系统或使用find(它本身走FS)。符号链接实际上并没有以任何有意义的方式链接到文件;它们只包含一个真实文件的路径。这些链接可以在任何地方,操作系统并不一定知道它们,直到它们在路径中使用。

2

不是没有搜索整个文件系统。

符号链接(在Linux中至少)基本上是指针。他们从一个地方指向另一个地方,但是他们指向的位置在没有详尽搜索的情况下无法知道指向它的位置。

您可以通过完全搜索来完成此操作,但根据您的系统,它可能很容易需要很长时间。

2

在PHP中,您可以 - 理论上 - 使用RecursiveDirectoryIterator并将其设置为从文件系统根目录遍历。然后,您可以检查currently iterated filesystem item is a link如果是的话,用readlink,看看它指出:

$fsi = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/'), 
    RecursiveIteratorIterator::SELF_FIRST 
); 
foreach ($fsi as $fso) { 
    if ($fso->isLink()) { 
     echo readlink($fso->getPathname()); 
    } 
} 

在实践中,你可能不会被允许做从用户执行PHP脚本。

+1

感谢您的帮助:-) – Eric 2010-11-09 22:34:48