Przybliżanie ruchu atomowego między systemami plików?


16

Muszę przenieść niektóre pliki z jednego systemu plików na inny w systemie Ubuntu. Jednak bardzo ważne jest, aby pliki nigdy nie istniały jako pliki częściowe lub niekompletne w miejscu docelowym, a przynajmniej nie pod poprawną nazwą pliku.

Jak dotąd moim jedynym rozwiązaniem jest napisanie skryptu, który pobiera każdy plik, kopiuje go do nazwy tymczasowej w miejscu docelowym, a następnie zmienia jego nazwę (która moim zdaniem powinna być atomowa) w miejscu docelowym na oryginalną nazwę pliku i na koniec usuwa plik źródłowy .

Jednak pisanie i debugowanie skryptu wydaje się przesadą w tym zadaniu. Czy istnieje sposób lub narzędzie, które już to robi w sposób natywny?


8
Wyczuwam problem Xy. Dlaczego tego potrzebujesz?
kura - przywróć Monikę

3
@henning Istnieje wiele możliwych przyczyn, więc to dobre pytanie. Na przykład program, który automatycznie próbuje przetworzyć pliki o nazwie pasującej do określonego wyrażenia regularnego (ale nie można go tymczasowo wyłączyć z przyczyn biurokratycznych). A może system kopii zapasowych, który zabiera pliki i przechowuje następnie na trwałym nośniku, ale tylko do zapisu.
wizzwizz4,

1
@henning Potrzebuję go, ponieważ mam wiele pamięci podręcznych, które odczytują z kilku różnych magazynów, ale jeden jest bliski pojemności i musi zostać usunięty z usługi. W związku z tym konieczne jest, aby każdy plik, jeśli istnieje w dowolnej lokalizacji, musi być kompletny i nienaruszony. W przeciwnym razie istnieje warunek wyścigu między początkiem a końcem transferu, w którym pamięć podręczna może pobrać (i zachować) niekompletny plik.
Niels2000,

Odpowiedzi:


27

rsynckopiuje do tymczasowych nazw plików (np. patrz rozszerzenie pliku tymczasowego Rsync i rsync - czy tworzy plik tymczasowy podczas przesyłania? ), chyba że skorzystasz z tej --inplaceopcji. Zmienia ich nazwy dopiero po pomyślnym przesłaniu pliku. rsyncusuwa również pliki docelowe, które zostały tylko częściowo przesłane (np. z powodu zapełnienia dysku lub innego błędu).

Istnieje również --remove-source-filesopcja, która usuwa pliki źródłowe po ich pomyślnym przesłaniu. Zobacz rsyncstronę podręcznika, aby uzyskać więcej informacji.

Podsumowując, możesz użyć czegoś takiego:

rsync -ax --remove-source-files source/ target/

Ta opcja jest szczególnie przydatna w przypadku zadań takich jak przenoszenie plików z kolejki „przychodzącej” lub podobnej do katalogu, w którym zostaną przetworzone.

Alternatywnie, jeśli jest to jednorazowe lustro, może po prostu użyć rsyncbez --remove-source-filesopcji. Możesz usunąć pliki źródłowe później, jeśli chcesz / potrzebujesz.


Myślałem, że będzie dobre narzędzie do tej pracy. Dzięki!
Niels2000,

@ Niels2000 Nie pamiętam, czy kiedykolwiek wcześniej korzystałem z tej opcji rsync, ale to, co chciałeś, brzmiało jak coś, co rsyncmożna zrobić, i wiedziałem, że przesyłało pliki o tymczasowej nazwie (chyba, że ​​używasz --inplace), więc spojrzałem w man rsynci znaleziono --remove-source-files. rsyncjest dobrym narzędziem do sprawdzenia w pierwszej kolejności prawie każdego zadania przesyłania plików.
cas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.