Назад | Перейти на главную страницу

MV с подстановочным знаком все еще атомарен

Насколько я понимаю, mv dir1 / file1 dir2 / является атомарным,

Является ли mv dir1 / * dir2 / атомарным?

В качестве примера предположим, что в каталоге dir1 есть 10 файлов по 10 ГБ каждый.

Начнем с утверждения, что mv не всегда атомарно.

Давайте также определим, что атомарность относится к содержимому файла, а не к имени файла.

Для любого отдельного файла перемещение или переименование, выполняемое mv является атомарным при условии, что файл перемещается в той же файловой системе. Атомарность не гарантирует, что файл находится только в том или ином месте; вполне возможно, что файл мог присутствовать в файловой системе в обоих местах одновременно «короткое время». Что действительно гарантирует атомарность, когда она предлагается, так это то, что содержимое файла мгновенно становится доступным полностью, а не частично. Вы можете себе представить, что mv в таких ситуациях можно было бы реализовать с ln с последующим rm.

mv определенно не является атомарным, когда он выполняет перемещение из одной файловой системы в другую или когда удаленная файловая система не может реализовать mv работа локально. В этих случаях mv можно сказать, что он реализован эквивалентом cp с последующим rm.

Теперь перейдем к вопросу об атомарности нескольких файлов. mv в лучшем случае атомарен только для каждого файла, поэтому, если вам нужно переместить несколько файлов вместе, реализация такова, что они будут перемещаться по одному. Если хочешь, mv file1 dir; mv file2 dir; mv file3 dir.

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

Нет. mv dir1/* такой же как mv dir1/file1 && mv dir1/file2 && mv dir1/fileN. Каждое отдельное движение атомарно, но не полный набор.

В другом случае новый файл добавляется в dir1 после запуска mv.

Поскольку "*" расширяется оболочкой, mv даже не узнает о новом файле.