![linux.png](https://steemitimages.com/640x0/https://cdn.steemitimages.com/DQmbHCJH8VbjYwqw4yvkUxV9yvVNrz2CtdLS6xnmGquXY8Y/linux.png)
mv (сокращённо от англ. move) — утилита в UNIX и UNIX-подобных системах, используется для перемещения или переименования файлов.
Синтаксис:
mv [опции...] исходный_файл целевой_файл
mv [опции...] исходный_файл... каталог
Примечание. Часто утилиту mv называют командой, опции — ключами, а файлы/каталоги — аргументами. В этом случае синтаксис будет следующим:
mv [ключи...] аргумент_1 аргумент_2
Если в качестве аргументов заданы имена двух файлов, то имя первого файла будет изменено на имя второго:
mv file_1 file_2
.Если последний аргумент является именем существующего каталога, то mv перемещает все заданные файлы в этот каталог:
mv file_1 ./dir/
(перемещаетfile_1
вdir/file_1
относительно текущего каталога). Если последний аргумент не является каталогом и задано более чем два файла, то будет выдано сообщение об ошибке.
Наглядные примеры с файлами и каталогами:
1. $ mv plain.txt plain_2.txt
— переименовать файл plain.txt в plain_2.txt.
2. $ mv tmp tmp_2
— переименовать каталог tmp в tmp_2. Если существует каталог tmp_2, то вместо переименования произойдёт перемещение каталога tmp в каталог tmp_2.
3. $ mv plain.txt tmp
— переместить файл plain.txt в каталог tmp. Если каталога tmp не существует, то вместо перемещения файл plain.txt переименуется в tmp.
4. $ mv /home/user/plain.txt /home/user/tmp
(где user — ваше имя в Linux) — то же, что и предыдущая команда, но с использованием абсолютного пути.
5. $ mv plain.txt ../
— переместить файл plain.txt в родительский каталог текущего каталога.
6. $ mv ../plain.txt .
— переместить из родительского каталога (../
) файл plain.txt в текущий каталог (.
).
7. $ mv ../plain.txt plain_2.txt
— переместить файл plain.txt из каталога на один уровень выше текущего в текущий и переименовать этот файл в plain_2.txt.
8. $ mv plain.txt /tmp_1/tmp_2/tmp_3/plain_2.txt
— переместить файл plain.txt из текущего каталога в каталог tmp_3 и переименовать этот файл в plain_2.txt.
Опции (ключи)
Утилита mv имеет ключи, с помощью которых можно задать дополнительные функции для команды.
-i
,--interactive
— интерактивный режим. Предупреждает, что выбранный файл будет записан поверх уже существующего в каталоге назначения.
Примеры:
1. $ mv -i plain.txt tmp
— переместить файл plain.txt в каталог tmp, в котором возможно уже находится файл plain.txt. Если в каталоге действительно находится файл plain.txt, в терминале появится запрос:
$ mv -i plain.txt tmp
mv: переписать 'tmp/plain.txt'? yes
Подтверждают, введя слово yes или да (можно одной буквой — y или д). Любой другой ввод пропустит файл.
2. $ mv -i /tmp/images/*.jpg .
— перемещает все изображения с расширением .jpg из каталога tmp/images/ в текущий каталог (.
). Если в текущем каталоге встретятся изображения с расширением .jpg, mv выдаст запрос на перезапись. В этой команде используется звёздочка (*) — это подстановочный знак (см. ниже главу «Подстановочные знаки»).
-f
,--force
— перезаписывать существующие файлы не спрашивая (не выдавать запрос на подтверждение операции). Опция может быть полезной, когда происходит перезапись нескольких файлов с правами для чтения. Например, есть каталог tmp, в котором находится файл plain.txt с правами для чтения; нужно перезаписать этот файл другим файлом plain.txt без лишних вопросов:
$ mv -f plain.txt tmp
Если бы не было ключа -f
, то в терминале появился бы вопрос, примерно, следующего содержания:
mv: заместить 'tmp/plain.txt', несмотря на права доступа 0464 (r--rw-r--)?
-n
,--no-clobber
— не перезаписывать существующий файл.
Пример:
1. $ mv -n plain.txt tmp
— переместить файл plain.txt в каталог tmp. Если в каталоге tmp уже есть файл plain.txt, то ничего не делать (не перемещать, не перезаписывать и не спрашивать).
Примечание для вышеперечисленных ключей. В случае ошибочной или преднамеренной записи, когда опции -f
, -i
и n
заданы вместе, срабатывает только последняя. Примеры:
1. $ mv -fi plain.txt tmp
— то же, что и mv -i
. Опция -f
игнорируется.
2. $ mv -if plain.txt tmp
— то же, что и mv -f
. Опция -i
игнорируется.
3. $ mv -fn plain.txt tmp
— то же, что и mv -n
. Опция -f
игнорируется.
-v
,--verbose
— режим дополнительных сообщений. Выводить на экран сообщение о каждой выполняемой операции.
Примеры:
1. $ mv -v plain.txt tmp
— переместить файл plain.txt в папку tmp и вывести сообщение о проделанной операции. В терминале отобразится следующее:
$ mv -v plain.txt tmp
renamed 'plain.txt' -> 'tmp/plain.txt'
Совместное использование опций -f
и -i
с -v
:
1. $ mv -vf plain.txt tmp
— переместить файл plain.txt в папку tmp, без вопроса на перезапись, и вывести сообщение о проделанной операции.
2. $ mv -vf plain* text/ tmp/
— переместить без запроса подтверждения все файлы из текущего каталога с именами, начинающимися с plain, вместе со всем каталогом text в каталог tmp, и показать порядок выполнения каждой операции.
3. $ mv -vi plain.txt tmp
— переместить файл plain.txt в папку tmp и если в этой папке находится файл с таким же именем, спросить подтверждение на перезапись, а после вывести сообщение о проделанной операции. В терминале будет следующее:
$ mv -vi plain.txt tmp
mv: переписать 'tmp/plain.txt'? yes
renamed 'plain.txt' -> 'tmp/plain.txt'
-t
,--target-directory=КАТАЛОГ
— переместить все исходные файлы в КАТАЛОГ.
Примеры:
1. $ mv -t tmp plain.txt plain_2.txt
— переместить файлы plain.txt и plain_2.txt в каталог tmp.
2. $ mv plain.txt plain_2.txt tmp
— то же, что и предыдущая команда.
T
,--no-target-directory
— считать НАЗНАЧЕНИЕ обычным файлом, а не каталогом.-u
,--update
— не перезаписывать файлы, если они более новые. Перемещение произойдёт только в том случае, если исходный файл новее чем целевой, или когда целевой файл не существует.-Z
,--context
— задать контекст безопасности SELinux файлу назначения как у типа по умолчанию. Для системы SELinux.--strip-trailing-slashes
— удаляет все конечные косые черты (слеши) из каждого исходного файла, заданного в качестве аргумента. Опция может пригодиться, когда исходный файл имеет косую черту на конце и указывает на каталог в виде символьной ссылки.--
— завершает список опций. Первый знак-
— признак опции, второй — начало опции. Применяется для использования с файлами, имена которых начинаются со знака минус (-).
Например, если сразу после команды mv или опции идёт файл, имя которого начинается на -
, в терминале появится ошибка, что такой опции не существует (invalid option, неверный ключ):
$ mv -plain.txt tmp
mv: неверный ключ - «p»
В данном случае команда не распознаёт опцию, начинающуюся с буквы p, за которой следуют символы plain.txt. В результате команда не знает, как поступить. Для исправления ошибки предваряют имя файла опцией --
и дают понять команде mv, что следующие за ней данные должны восприниматься не как опция, а как имя файла:
$ mv -- -plain.txt tmp
Примечание. Можно вместо опции --
использовать точку как часть пути к файлу и тем самым устранить ошибку, которая ввела в заблуждение команду mv. Например:
$ mv ./-plain.txt tmp
Резервные копии
Опции:
--backup[=КОНТРОЛЬ]
— создание резервных копий существующих файлов, используя способ контроля версий. Если КОНТРОЛЬ опущен,--backup
ведёт себя так же, как-b
.-b
— похож на--backup
, но не использует способ контроля версий. Вместо этого используются параметры, указанные в переменной окружения VERSION_CONTROL.S
,--suffix=СУФФИКС
— указывает суффикс имени файла, который будет использоваться для всех резервных копий. Значением по умолчанию является тильда (~).
При использовании опции -b
или --backup
, mv переименовывает целевой файл, если он существует, добавив суффикс к его имени. Тем самым сохраняется копия исходного файла, а не его перезаписанный вариант.
Существует два типа резервных копий — простые и нумерованные:
Простые резервные копии удаляют существующий файл резервной копии. Сохраняется только одна копия. Суффиксом по умолчанию для простых резервных копий является тильда (~). Например, файл plain.txt будет сохранён как plain.txt~. Можно изменить этот суффикс с помощью опции
--suffix
или установить переменную окружения SIMPLE_BACKUP_SUFFIX.Нумерованные резервные копии сохраняют существующие файлы резервных копий, создавая дополнительные резервные копии с возрастающим номером в имени файла. Резервные файлы не удаляются. Суффикс для нумерованных резервных копий:
.~n~
, где n — целое число. Например, файл plain.txt будет сохранён в виде файла plain.txt.~1~, затем plain.txt.~2~ и т. д.
Доступны дополнительные правила для создания резервных копий с помощью контроля версий. Способ контроля версий устанавливается опцией --backup
или переменной окружения VERSION_CONTROL. Значения:
none
,off
— никогда не создавать резервных копий, даже если указан ключ--backup
.numbered
,t
— создавать нумерованные резервные копии.existing
,nil
— если существуют нумерованные копии, то создавать нумерованные (numbered) иначе создавать простые (simple).simple
,never
— всегда создавать простые резервные копии.
Примеры:
1. $ mv -b plain.txt plain_2.txt
— если plain_2.txt существует, он будет переименован в plain_2.txt~.
2. $ mv -b --suffix=.bak plain.txt plain_2.txt
— если plain_2.txt существует, он будет переименован в plain_2.txt.bak.
3. $ mv --backup=numbered plain.txt plain_2.txt
— если plain_2.txt существует, он будет переименован в plain_2.txt.~1~. Если plain_2.txt.~1~ существует, он будет переименован в plain_2.txt.~2~ и т. д.
4. $ VERSION_CONTROL=numbered mv -b plain.txt plain_2.txt
— то же, что и в предыдущем примере. Переменная окружения определяется только для этой команды.
5. $ export VERSION_CONTROL=numbered; mv -b plain.txt plain_2.txt
— при экспорте переменной окружения VERSION_CONTROL все команды mv -b
для текущего сеанса будут использовать нумерованные резервные копии.
6. $ export VERSION_CONTROL=numbered; mv plain.txt plain_2.txt
— даже если переменная VERSION_CONTROL установлена, резервные копии не создаются, потому что -b
не было указано. Если файл plain_2.txt существует, он перезаписывается.
Экранирование
1. $ mv My\ plain.txt My\ plain\ 2.txt
— переименовать файл My plain.txt в My plain 2.txt. Здесь пробелы в имени файла экранируются косой чертой; если этого не сделать, Linux будет рассматривать что-либо после пробела как опцию или дополнительную команду.
2. $ mv "My plain.txt" "My plain 2.txt"
— то же, что и предыдущая команда. В качестве экрана выступают двойные кавычки.
3. $ mv "My plain.txt" tmp
— если tmp каталог, My plain.txt перемещается в него. Если tmp является файлом, My plain.txt переименовывается в tmp, а исходный tmp перезаписывается. Если tmp не существует, My plain.txt переименовывается в tmp.
Подстановочные знаки
Знак звёздочки
1. $ mv My*.txt tmp
— в команде используется подстановочный знак *
. Если tmp является каталогом, все файлы с расширением .txt, чьё имя начинается с My, будут перемещены в tmp (например, My plain.txt, Myself.txt и т. п.). Если tmp не существует или не является каталогом, mv сообщает об ошибке и ничего не делает.
2. $ mv -i tmp/images/*.png tmp/img/
— перемещает все изображения с расширением .png из каталога tmp/images/ в каталог tmp/img/. Если в текущем каталоге встретятся изображения с расширением .png, mv выдаст запрос на перезапись.
Знак вопроса
1. $ mv plain??.txt tmp
— здесь подстановочный знак ?
и в этой команде используется дважды, а значит может соответствовать максимум двум символам. Если tmp является каталогом, то любой файл с двумя символами между plain и .txt в их имени перемещается в tmp (например, plain_2.txt, plain03.txt и т. п.). Если tmp не существует или не является каталогом, mv сообщает об ошибке и ничего не делает.
2. $ mv My\ plain?.txt tmp
— в этой команде всего один подстановочный знак ?
. Если tmp является каталогом, то любой файл с одним символом между My plain и .txt в их имени перемещается в tmp (например, My plain1.txt, My plain2.txt и т. п.).
Справка
--help
— справочная информация о программе:$ mv --help
--version
— информация о версии программы:$ mv --version
Получить информацию о ключах mv можно с помощью утилиты man:
$ man mv
Для выхода из man используют клавишу q
.
Несколько полезных замечаний
1. Для того чтобы гарантировать, что каталог, например, tmp — это каталог, желательно указать после него косую черту. Тогда команда примет следующий вид:
$ mv plain.txt tmp/
Если окажется, что tmp — не каталог, команда не переместит файл. Так можно предотвратить перезапись файла.
2. Если перемещается ссылка, указывающая на каталог, то нужно внимательно следить за вводимыми данными. Например, в рабочем каталоге лежит ссылка cats, которая указывает на каталог /home/user/images/cats, и нужно переместить эту ссылку в каталог /home/user/barsik. Следующая команда перемещает лишь саму ссылку:
$ mv cats ~/barsik
А вот эта команда перемещает каталог, на который эта ссылка указывает:
$ mv cats/ ~/barsik
Различие между ними лишь в косой черте, которая вводится после ссылки. Если символ /
отсутствует, перемещается лишь сама ссылка. Включив этот символ, mv переместит каталог, а не ссылку.
3. Утилита mv не интерпретирует регулярные выражения (regex). Если нужно переименовать много файлов, используя сложное или детальное сопоставление старых и новых имён, следует использовать утилиту rename (установка утилиты для ОС на основе Ubuntu и Debian: sudo apt install rename
). Rename принимает регулярные выражения Perl. Примеры:
$ rename 's/plain(..)/document$1/' plain*
— переименовать файлы plain.txt и plain_2.txt в document.txt и document_2.txt.$ rename 's/My\ plain(..)/doc$1/' My*
— переименовать файлы My plain.txt и My plain 2.txt в doc.txt и doc 2.txt.
Перемещение = Переименование
Перемещение файла внутри одной файловой системы в действительности равнозначно его переименованию: данные самого файла при этом остаются на тех же секторах диска, а изменяются каталоги, в которых произошло перемещение.
Перемещение предполагает удаление ссылки на файл из того каталога, откуда он перемещён, и добавление ссылки на этот самый файл в тот каталог, куда он перемещён. В результате изменяется полное имя файла — полный путь, т. е. положение файла в файловой системе.
Дополнение к этой главе (из других источников):
1. Когда исходный и целевой файлы находятся на одной файловой системе, они являются одним и тем же файлом (изменяется только имя файла; владелец, права доступа, временные штампы остаются неизменными).
Если же они находятся на разных файловых системах, то исходный файл копируется и затем удаляется. mv будет копировать время последней модификации, время доступа, идентификаторы пользователя, группы и права доступа к файлу если это возможно. Если копирование идентификаторов пользователя и/или группы закончилось неудачно, то в копии файла сбрасываются биты setuid и setgid.
2. Различия утилит cp и mv. Операции копирования (cp) и перемещения/переименования (mv) выглядят сходными, однако по сути своей глубоко различны. Начать с того, что команда mv не совершает никаких действий с перемещаемыми или переименовываемыми файлами, она модифицирует каталоги, к которым приписаны имена этих файлов. Это имеет два важных следствия.
Во-первых, при перемещении/переименовании файлы сохраняют первозданными атрибуты доступа, принадлежности и даже времени изменения метаданных (ctime) и модификации данных (mtime): ведь ни те, ни другие при перемещении/переименовании файла не изменяются.
Во-вторых, для выполнения этих действий можно не иметь никаких вообще прав доступа к файлам, достаточно иметь право на изменение каталогов, в которых они переименовываются или перемещаются: ведь имя файла фигурирует только в составе каталога и нигде более.
![](https://steemitimages.com/640x0/https://cdn.steemitimages.com/DQmNNPTZ9s3p41cdseLiKtwp9vgidh7i1t5RTjFpuzGMv48/neocities.png)