mv — перемещение/переименование файлов (Linux)

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): ведь ни те, ни другие при перемещении/переименовании файла не изменяются.
Во-вторых, для выполнения этих действий можно не иметь никаких вообще прав доступа к файлам, достаточно иметь право на изменение каталогов, в которых они переименовываются или перемещаются: ведь имя файла фигурирует только в составе каталога и нигде более.
Neocities