Pracuję nad narzędziem do synchronizacji plików opartym na Perlu. Pobiera pliki do katalogu tymczasowego (który gwarantuje, że jest na tym samym systemie plików co plik rzeczywisty), a następnie przenosi pliki tymczasowe na miejsce na stare, zachowując metadane, takie jak uprawnienia, prawa własności i listy ACL. Zastanawiam się, jak osiągnąć ten ostatni krok na Linuksie.Zapisywanie pliku Atom w systemie Linux bez utraty metadanych
Na Mac OS X, przynajmniej w C, użyłbym funkcji exchangedata
. Zajmuje to dwie nazwy plików jako argumenty i zamienia ich zawartość, pozostawiając wszystkie metadane (oprócz mtime) w stanie nienaruszonym. Gwarantuje to, że operacja jest atomowa - wszyscy czytelnicy zobaczą stary plik lub nowy, nigdy coś pośredniego. Niestety, nie sądzę, że jest dostępny w systemie Linux.
Wiem, że rename
porusza się atomowo, ale nie zachowuje metadanych. Z drugiej strony, mógłbym otworzyć plik i zastąpić dane zawartością nowego, który zachowałby wszystkie metadane, ale nie byłby operacją atomową. Wszelkie sugestie dotyczące rozwiązania tego problemu?
Jakiego rodzaju metadanych pracujesz tak ciężko, aby je zachować? Wszystko, co jest w systemie Unix, to właściciel/grupa i uprawnienia dla właściciela/grupy/wszystkich. Czy to zmienia się tak bardzo, że byłoby to dla ciebie problemem? –
Wiele systemów plików Linux obsługuje również rozszerzone atrybuty i listy ACL, a nieuprzywilejowany użytkownik może nie mieć wymaganych uprawnień do zmiany użytkownika i grupy pliku tymczasowego na stare. Zasadniczo jest tu dużo subtelności i zastanawiam się, czy coś już istnieje, aby sobie z tym poradzić. –