2010-11-09 4 views

Répondre

7

Sans traverser le système de fichiers à la recherche de tous les liens symboliques, puis vérifier leur destination, non. Mais si vous voulez toujours faire cela, c'est plutôt simple:

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

Merci, j'espérais éviter de scanner tout le système de fichiers, mais j'apprécie le code :-) – Eric

4

Pas sans marcher le système de fichiers ou en utilisant find (qui lui-même marche le FS). Les liens symboliques ne sont pas réellement liés à un fichier de manière significative; ils contiennent juste un chemin vers le fichier réel. Ces liens peuvent être n'importe où, et le système d'exploitation ne les connaît pas nécessairement jusqu'à ce qu'ils soient utilisés dans un chemin.

2

Pas sans avoir à chercher dans tout le système de fichiers.

Les liens symboliques (dans Linux au moins) sont essentiellement des pointeurs. Ils pointent d'un endroit à l'autre, mais l'endroit qu'ils pointent n'a aucun moyen de savoir ce qui le désigne sans une recherche exhaustive.

Vous pouvez le faire en effectuant une recherche complète, mais cela peut prendre beaucoup de temps en fonction de votre système.

2

En PHP, vous pourriez - en théorie - utiliser un RecursiveDirectoryIterator et le définir pour traverser de la racine du système de fichiers. Vous pouvez ensuite vérifier si le currently iterated filesystem item is a link et le cas échéant, utiliser readlink pour voir où il pointe:

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

Dans la pratique, vous serez probablement pas autorisé à faire de l'utilisateur exécutant le script PHP.

+1

Merci pour l'aide :-) – Eric

Questions connexes