Введение
Командная утилита Unix
mv — это команда Unix, которая перемещает один или несколько файлов или каталогов из одного места в другое. Если оба имени файлов находятся в одной файловой системе, это приводит к простому переименованию файла; в противном случае содержимое файла копируется в новое местоположение, а исходный файл удаляется. Для использования mv пользователю требуется разрешение на запись для каталогов, между которыми перемещается файл. Это связано с тем, что mv изменяет содержимое обоих каталогов (то есть исходного и целевого), участвующих в перемещении. При использовании команды mv для файлов, расположенных в одной файловой системе, метка времени файла не обновляется. В реализациях UNIX, основанных на AT&T UNIX, команды cp, ln и mv реализованы как единая программа с жестко связанными бинарными файлами. Выбор поведения определяется по имени пути argv[0]. Это распространенный прием, позволяющий тесно связанным командам, объединенным в один пакет, пользователю указывать конкретный ход запланированного действия.
История
Команда для перемещения записи каталога в новый каталог была впервые реализована в Multics. Позже эта команда появилась в Unix версии 1 и вошла в состав X/Open Portability Guide, выпуск 2, 1987 года. Версия команды mv, включенная в GNU coreutils, была написана Майком Паркером, Дэвидом Маккензи и Джимом Мейерингом. Команда также была портирована на операционную систему IBM i.
Существующий файл в конфликте
Когда имя файла перемещается на существующее имя файла, существующий файл по умолчанию удаляется (заменяется). Если существующий файл не доступен для записи, но находится в каталоге, доступном для записи, команда mv запрашивает подтверждение (если выполняется из терминала) перед продолжением, если только не используется опция `f` (force – принудительно). Случайную перезапись можно предотвратить с помощью флага GNU `n` (длинный формат: no clobber – не заменять). В качестве альтернативы, `u` (update – обновление) перезаписывает только файлы назначения, которые старше исходных файлов, `i` (interactive – интерактивный) запрашивает подтверждение при каждом конфликте имен, а `b` (backup – резервная копия) переименовывает целевые файлы. Связанная неопределенность возникает, когда имя файла перемещается в существующий каталог. По умолчанию, mv интерпретирует это как попытку переместить имя внутрь этого каталога. GNU mv имеет опцию для отключения этого предположения и попытки перезаписать сам каталог. Обратная опция делает операцию перемещения в каталог явной.
Перемещение против копирования и удаления
Перемещение файлов в пределах одной файловой системы обычно реализуется иначе, чем копирование файла с последующим удалением оригинала. На платформах, не поддерживающих системный вызов переименования (rename syscall), в новый каталог добавляется новая ссылка, а исходная удаляется. Доступ к данным файла не осуществляется. Все системы, соответствующие стандарту POSIX, реализуют вызов rename. Фактическое перемещение (по сути, переименование) значительно быстрее, чем обходной путь копирования и перемещения. Номер i файла (сокращение от "номер inode") не изменяется. Для чтения перемещаемого файла не требуется никаких разрешений, поскольку, концептуально, изменяется только информация в каталоге в результате "перемещения". Поскольку исходный и целевой каталоги модифицируются – то есть записи создаются в целевом каталоге и удаляются из исходного – для завершения перемещения требуется разрешение на запись в обоих каталогах. Перемещение файлов между разными файловыми системами может полностью завершиться неудачей или быть автоматически выполнено как атомарная операция копирования и удаления; конкретные детали зависят от реализации. Перемещение каталога из одного родительского каталога в другой требует разрешения на запись в перемещаемом каталоге, а также разрешений на изменение старого и нового родительских каталогов. Это связано с тем, что номер i для записи каталога ".." (который может использоваться в любом контексте как псевдоним для родительского каталога текущего каталога) изменяется в результате переименования.
Примеры
Команда объяснение: mv myfile mynewfilename переименовывает 'myfile' в 'mynewfilename'. mv myfile subdir/myfile перемещает 'myfile' в 'subdir/myfile' относительно текущего каталога. mv myfile subdir то же самое, что и предыдущая команда, имя файла подразумевается. mv be.03 /mnt/bkup/bes копирует 'be.03' в каталог 'bes' на смонтированном томе 'bkup', после чего 'be.03' удаляется. mv be.03/* /mnt/bkup/bes То же самое, что и выше, но каждый файл, перемещенный из 'be.03', удаляется по отдельности, а не все сразу после завершения копирования. mv afile another mydir перемещает несколько файлов в каталог 'mydir'. mv /var/log/*z ~/logs Это может занять больше времени, чем ожидалось, если '/var' находится на другой файловой системе, что часто бывает, поскольку файлы будут скопированы, а затем удалены. Оболочка расширяет ~ до домашнего каталога пользователя и обрабатывает * как подстановочный знак. Обратите внимание, что в приведенном выше примере /mnt относится к каталогу ("точка монтирования"), над которым смонтирована данная файловая система. Именование таких каталогов /mnt является распространенной, но не обязательной практикой. "Файловую систему" можно представить как независимое дерево, которое логически рассматривается как единое целое; ее корневой каталог "монтируется" поверх каталога, выбранного администратором. Любое предыдущее содержимое этого каталога становится невидимым, но оно "восстанавливается" при отмонтировании тома.