замените файл жесткой ссылкой на другой файл атомарно

StackOverflow https://stackoverflow.com/questions/2565899

  •  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 при сбое).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top