Насколько я понимаю, 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 даже не узнает о новом файле.