Nano Hash - криптовалюты, майнинг, программирование

Как я могу представить символические ссылки файловой системы в хэше Perl?

В случае сбоя сервера как составить список цепочек символических ссылок? (не мой вопрос) говорит о перечислении всех символических ссылок и переходе по ним. Чтобы сделать это возможным, давайте сначала рассмотрим отдельный каталог.

Я хочу написать небольшую утилиту, которая сделает это. Выглядит легко поместить пары из символических ссылок в хеш, а затем обработать хеш.

Но тогда у меня могло бы получиться что-то вроде:

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? Если нет, то каковы хорошие вспомогательные модули?

  • Также приветствуется отправка образца кода для решения проблемы. 23.02.2010
  • Также приветствуется показать нам, что вы пробовали до сих пор. :) 24.02.2010
  • @brian Doh! Я видел в этом в основном чью-то аккуратную проблему и не пытался решить ее, не осознавая некоторые подводные камни. 24.02.2010

Ответы:


1

На 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: @cycle\n";
}
else {
  print "$0: $dir: no cycles\n";
}

Например, в каталоге, похожем по структуре на тот, который указан в вашем вопросе, вывод будет

$ ../has-cycle 
../has-cycle: .: at least one cycle: c -> a -> b
23.02.2010
  • Спасибо, что разместили это. Я собираюсь взглянуть на Graph для некоторых других потребностей, которые у меня есть, и освежить в памяти подобные вещи. 25.02.2010


  • 3

    Вам нужно сохранить больше, чем просто название ссылки. Либо возьмите номер inode (если ваша FS поддерживает это), либо какой-нибудь другой уникальный аспект. Если таковой не существует, подумайте о создании своего собственного, возможно, путем подсчета контрольной суммы имени / даты создания / последнего изменения. В любом случае вам нужен способ однозначно идентифицировать каждую ссылку. Я видел некоторые утилиты, которые просто устанавливают ограничение на количество ссылок (от 8 до 255) и объявляют все, что превышает это ограничение, циклом, но я всегда считал это «дешевым выходом». :)

    23.02.2010
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..