заменить файл с жесткой ссылкой на другой файл атомарно - PullRequest
2 голосов
/ 02 апреля 2010

У меня есть две записи каталога, а и б. До, a и b указывают на разные inode. После этого я хочу, чтобы b указывал на тот же индекс, что и a. Я хочу, чтобы это было безопасно. Я имею в виду, что если я где-то потерплю неудачу, b либо указывает на свой исходный инод, либо на инод. особенно я не хочу, чтобы в конце концов исчез b.

mv атомарен при перезаписи.

ln не работает, если пункт назначения уже существует.

похоже, я могу сказать:

в год mv tmp b

, который в случае сбоя оставит файл 'tmp', что нежелательно, но не является катастрофой.

Есть ли лучший способ сделать это?

(то, что я на самом деле пытаюсь сделать, это заменить файлы с одинаковым содержимым на один инод, содержащий это содержимое, общее для всех записей каталога)

Ответы [ 2 ]

1 голос
/ 17 июня 2010
 ln a tmp ; mv tmp b

на самом деле самый быстрый способ сделать это атомарно, как вы указали в своем вопросе.

(угол Nitpickers: быстрее разместить оба системных вызова в одной программе)

0 голосов
/ 16 января 2014

ln a tmp && mv tmp b || rm tmp

кажется лучше, так как тогда, если ln завершится неудачей, mv не будет выполнен (и загромождет stderr, если он не выполнится).

...