Приблизний атомний хід через файлові системи?


16

Я маю переміщувати деякі файли з однієї файлової системи в іншу під Ubuntu. Однак дуже важливо, щоб ці файли ніколи не були частковими або неповними файлами в пункті призначення, принаймні, не під правильним іменем файлу.

Поки що моє єдине рішення - написати сценарій, який бере кожен файл, копіює його у тимчасове ім'я в пункті призначення, а потім перейменовує його (що, на мою думку, має бути атомним) у пункті призначення, до вихідного імені файлу та остаточно видаляє початковий файл .

Однак написання та налагодження сценарію здається надмірним для цього завдання. Чи є спосіб або інструмент, який вже робить це споконвічно?


8
Я відчуваю проблему xy. Навіщо вам це потрібно?
Хенінг - відновлення Моніки

3
@henning Існує маса можливих причин, тому це хороше питання. Наприклад, програма, яка автоматично намагається обробити файли з ім'ям файлу, що відповідає певному регулярному вираженню (але не може бути тимчасово вимкнено з бюрократичних причин). Або, можливо, система резервного копіювання, яка бере файли та зберігає потім на міцних, але тільки для запису носіях.
wizzwizz4

1
@henning мені це потрібно, тому що у мене є декілька кеш-пам'яті, які читаються з декількох сховищ, але один наближається до потенціалу і його потрібно вилучити зі служби. Відповідно, необхідно, щоб кожен файл, якщо він існує в будь-якому з локацій, повинен бути повним і неушкодженим. В іншому випадку існує перегонова умова між початком і закінченням передачі, коли кеш може схопити (і зберегти) неповний файл.
Niels2000

Відповіді:


27

rsyncкопії у тимчасові назви файлів (наприклад, див. розширення тимчасового файлу Rsync та rsync - чи створюється він тимчасовий файл під час передачі? ), якщо не використовується --inplaceпараметр. Він перейменовує їх лише після успішного перенесення файлу. rsyncтакож видаляє будь-які файли призначення, які були передані лише частково (наприклад, через повний диск або іншу помилку).

Також є --remove-source-filesопція, яка видаляє вихідні файли (файли) після їх успішного перенесення. Докладніші відомості див. На rsyncсторінці чоловіка.

Вказавши все це разом, ви можете використовувати щось на кшталт:

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

Цей параметр особливо корисний для таких завдань, як переміщення файлів із черги "вхідних" або подібних до каталогу, де вони будуть оброблятися.

Крім того, якщо це одноразове дзеркало, можливо, просто використовувати rsyncбез цього --remove-source-filesваріанту. Ви можете видалити вихідні файли пізніше, якщо вам потрібно.


Я думав, що буде хороший інструмент для роботи. Спасибі!
Niels2000

@ Niels2000 Я не можу пригадати, чи раніше я використовував цю опцію rsync, але те, що ви хотіли, звучало як те, що rsyncможна зробити, і я знав, що це передає файли з тимчасовим іменем (якщо ви не використовуєте --inplace), тому я подивився в man rsyncі знайдено --remove-source-files. rsyncє хорошим інструментом для перевірки спочатку майже будь-якого завдання з передачі файлів.
cas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.