Приближается атомарный ход по файловым системам?

16

Я должен переместить некоторые файлы из одной файловой системы в другую под Ubuntu. Тем не менее, очень важно, чтобы файлы никогда не существовали как целевые или неполные файлы в месте назначения, по крайней мере, не под правильным именем файла.

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

Однако написание и отладка скрипта кажется слишком сложным для этой задачи. Есть ли способ или инструмент, который уже делает это изначально?

Niels2000
источник
8
Я чувствую проблему xy. зачем вам это?
Хеннинг - восстановить Монику
3
@henning Есть много возможных причин, так что это хороший вопрос. Например, программа, которая автоматически пытается обработать файлы с именем файла, соответствующим определенному регулярному выражению (но не может быть временно отключено по бюрократическим причинам). Или, может быть, система резервного копирования, которая принимает файлы и сохраняет их на надежном, но только для записи носителе.
wizzwizz4
1
@ Henning мне это нужно, потому что у меня есть несколько кешей, которые читают из нескольких разных хранилищ, но один из них приближается к емкости и должен быть удален из обслуживания. Соответственно, необходимо, чтобы каждый файл, если он существует в каком-либо месте, был целостным и неповрежденным. В противном случае существует условие состязания между началом и окончанием передачи, когда кэш может захватить (и сохранить) неполный файл.
Niels2000

Ответы:

27

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

Существует также --remove-source-filesопция, которая удаляет исходные файлы после их успешной передачи. Смотрите rsyncman-страницу для более подробной информации.

Собрав все это вместе, вы можете использовать что-то вроде:

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

Этот параметр особенно полезен для задач, таких как перемещение файлов из «входящей» очереди или аналогично каталогу, в котором они будут обрабатываться.

В качестве альтернативы, если это разовое зеркало, возможно, просто используйте rsyncбез --remove-source-filesопции. Вы можете удалить исходные файлы позже, если хотите / должны.

саз
источник
Я думал, что будет хороший инструмент для работы. Благодарность!
Niels2000
@ Niels2000 Я не помню, использовал ли я когда-либо эту опцию rsync, но то, что вы хотели, звучало как то, что rsyncможно сделать, и я знал, что он переносил файлы с временным именем (если вы не используете --inplace), поэтому я посмотрел в man rsyncи нашел --remove-source-files. rsyncЭто хороший инструмент для проверки практически любой задачи передачи файлов.
cas