замените файл жесткой ссылкой на другой файл атомарно
-
23-09-2019 - |
Вопрос
У меня есть две записи каталога, a и b.Ранее a и b указывали на разные индексы.После этого я хочу, чтобы b указывал на тот же индекс, что и a.Я хочу, чтобы это было безопасно - под этим я подразумеваю, что если я где-то потерплю неудачу, b либо укажет на свой исходный индекс, либо на индекс a.больше всего я не хочу, чтобы в итоге b исчез.
mv является атомарным при перезаписи.
ln, похоже, не работает, когда пункт назначения уже существует.
так что, похоже, я могу сказать:
ln a tmp mv tmp b
который в случае сбоя оставит файл 'tmp', что нежелательно, но не является катастрофой.
Есть ли лучший способ сделать это?
(что я на самом деле пытаюсь сделать, так это заменить файлы с идентичным содержимым одним индексом, содержащим это содержимое, общим для всех записей каталога)
Решение
ln a tmp ; mv tmp b
на самом деле это самый быстрый способ сделать это атомарно, как вы указали в своем вопросе.
(Угол придирок:быстрее разместить оба системных вызова в одной программе)
Другие советы
ln a tmp && mv tmp b || rm tmp
кажется лучше, как тогда, если ln
терпит неудачу, то mv
не будет выполнен (и загромождает stderr при сбое).