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

in #rulast year (edited)

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 переименовывает целевой файл, если он существует, добавив суффикс к его имени. Тем самым сохраняется копия исходного файла, а не его перезаписанный вариант.

Существует два типа резервных копий — простые и нумерованные:

  1. Простые резервные копии удаляют существующий файл резервной копии. Сохраняется только одна копия. Суффиксом по умолчанию для простых резервных копий является тильда (~). Например, файл plain.txt будет сохранён как plain.txt~. Можно изменить этот суффикс с помощью опции --suffix или установить переменную окружения SIMPLE_BACKUP_SUFFIX.

  2. Нумерованные резервные копии сохраняют существующие файлы резервных копий, создавая дополнительные резервные копии с возрастающим номером в имени файла. Резервные файлы не удаляются. Суффикс для нумерованных резервных копий: .~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