Как найти символические ссылки на текущий файл? - PullRequest
4 голосов
/ 09 ноября 2010

Есть ли способ в PHP или Perl найти все символические ссылки на текущий файл?

Ответы [ 4 ]

7 голосов
/ 09 ноября 2010

Не обходя файловую систему, ища все символические ссылки и затем проверяя их назначение, нет.Но если вы все еще хотите сделать это, это довольно просто:

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;
    },
    '/'
);
4 голосов
/ 09 ноября 2010

Не обходя файловую систему или не используя find (которая сама обходит ФС).Симлинки на самом деле не имеют никакого отношения к файлу;они просто содержат путь к реальному файлу.Эти ссылки могут быть где угодно, и ОС не обязательно знает о них, пока они не будут использованы в пути.

2 голосов
/ 09 ноября 2010

В PHP вы можете - теоретически - использовать RecursiveDirectoryIterator и установить его для прохождения от корня файловой системы. Затем вы можете проверить, является ли элемент итерированной в настоящее время файловой системы ссылкой , и если это так, используйте readlink , чтобы увидеть, куда он указывает:

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

На практике вам, скорее всего, не разрешат делать это от пользователя, выполняющего скрипт PHP.

2 голосов
/ 09 ноября 2010

Не без поиска по всей файловой системе.

Симлинки (по крайней мере в linux) - это в основном указатели. Они указывают из одного местоположения в другое, но местоположение, на которое они указывают, не может знать, что указывает на это, без тщательного поиска.

Вы можете сделать это с помощью полного поиска, но это может легко занять много времени в зависимости от вашей системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...