Переименование файла во время его записи

Переименование файла во время его записи

Интересно, считается ли это безопасным. Я знаю, что дескрипторы файлов работают нормально, пока сохраняется ссылка, и я знаю, что идентификатор — это инода, а не имя, но я не уверен, как это работает в разных ФС.

Например, копирование с жесткого диска ext4 на USB-накопитель NTFS или копирование с USB-накопителя FAT на диск ext4.

Я просто копировал кучу больших медиафайлов и переименовал их перед копированием. Контрольные суммы совпадают. Интересно, всегда ли это безопасно, будет ли работать в обратном направлении, есть ли какие-то особенности, о которых мне следует знать, или причины избегать этого?

Операционная система/дистрибутив — Ubuntu с ядром Linux 5.0.0-15.

решение1

Я не уверен, как это работает в разных ФС.

Сама операция переименования не работает в разных файловых системах; нет никакой разницы между записью в файл, скажем, из текстового редактора и записью в файл с использованием cpисходного файла в другой файловой системе.

В Linux renameсистемный вызов прозрачен для других ссылок на файл, включая другие жесткие ссылки и описания открытых файлов (и дескрипторы).На странице руководства явно указано

Открытые файловые дескрипторы длястарый путьтакже не затронуты.

(Я указываю «на Linux» только потому, что не смог найти ссылку в POSIX; я думаю, что это распространено во всех операционных системах в стиле POSIX.)

Итак, когда вы копируете файл между файловыми системами, cpоткрывает источник для чтения, цель для записи и начинает копирование. Операции переименования не влияют на используемые дескрипторы файлов; вы можете переименовать источник и/или цель, не затрагивая cp.

Другой способ думать об этом заключается в том, что имя файла в его содержащем каталоге является частью его записи каталога, которая указывает на его inode; описания открытых файлов являются другими указателями на inode, как и другие жесткие ссылки. Изменение имени файла не влияет ни на какие другие существующие указатели.

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

Связанный контент