2010-11-09 35 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