Bash: Симлинк - PullRequest
       66

Bash: Симлинк

1 голос
/ 13 апреля 2011

У меня есть файловое дерево, содержащее кучу данных, которые я сгенерировал. Я решил, что на нескольких этапах генерации данных я бы хотел попробовать разные варианты конфигурации в программах, которые привыкли.

Моим решением было дублирование дерева данных и создание символической ссылки на все исходные данные (умноженное на количество новых тестов, которые я выполняю). Затем я позволяю программам блокировать символические ссылки по мере необходимости. Результатом будут символические ссылки на исходное дерево для данных, которые не были затронуты моими новыми конфигурациями, и реальные данные для всего нового.

Проблема в том, что опция -clobber в большинстве программ, которые я использую, следует по символическим ссылкам, поэтому она фактически перекрыла мои исходные данные. Могу ли я попробовать что-нибудь (может быть, что-то вроде настроек среды bash?), Которое может привести к тому, что все эти программы будут забивать фактическую символическую ссылку, а не данные, на которые она указывает?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2011

Перед записью программы проверяют, совпадает ли новый вывод со старым?Если нет, то кажется, что символические ссылки не дадут какого-либо преимущества, поскольку хранилище данных всегда будет уникальным в ходе выполнения анализа.

Вы можете изменить способ, которым программы записывают свой вывод?Следующая последовательность не будет следовать по символической ссылке:

  1. записать новый вывод в out.tmp
  2. , если старый вывод out и out.tmp идентичны, удалить out.tmp
  3. в противном случае переместите out.tmp поверх out

Насколько велики данные?Достаточно ли он большой, чтобы стоить усилий по оптимизации требований к хранилищу?Вы всегда можете сохранить полный вывод и выполнить некоторый анализ (в простейшем случае, diff) после факта, чтобы увидеть, совпадают ли данные.

Если данных много, вы можетеВы хотите обратиться к файловой системе, которая будет оптимизировать дубликаты данных для вас (функция известна как "дедупликация").Или вы можете использовать Поддержка снимков LVM , которая позволяет делать дешевые копии файлов при записи файловой системы.

В качестве дедуплицирующей файловой системы бедного человека вы можете сделать что-то вродеэто в bash:

for file in $output_files; do
    md5=`md5sum $file | awk '{print $1}'`
    if [ ! -f "db/$md5" ]; then
        mv $file db/$md5
    fi
    ln -sf db/$md5 $file
done
0 голосов
/ 13 апреля 2011

Это, вероятно, невозможно - эта опция, вероятно, работает, просто открывая файл в режиме «усечения», - чтобы заменить символическую ссылку, для этого фактически необходимо предварительно удалить файл [символическую ссылку] отдельной функцией. Вы можете попробовать установить разрешения (chmod -w) для исходного файла данных, чтобы запретить запись, но это может просто помешать его работе

...