← Весь справочник

mv

Перемещение и переименование файлов и каталогов

mv переименовывает файл или переносит его в другой каталог. Отдельной команды «переименовать» в Linux нет — это тоже mv. Каталоги переносятся без -r. В песочнице — GNU coreutils 9.4.

Синтаксис

mv [опции] старое_имя новое_имя      # переименовать
mv [опции] источник… каталог/        # перенести внутрь каталога
mv [опции] -t каталог источник…      # то же, каталог первым

Если последний аргумент — существующий каталог, источники ложатся внутрь него. Иначе источник получает новое имя (и существующий файл с этим именем заменяется).

Опции

ОпцияЧто делает
-iспрашивать перед перезаписью существующего файла
-nникогда не перезаписывать; в 9.4 печатает not replacing 'файл' и возвращает 1
-fне спрашивать. Из -f, -i, -n действует та, что указана последней
-uпереносить, только если источник новее назначения или назначения нет (--update=older)
--update=noneто же, что -n
-vпечатать каждое действие: renamed 'x' -> 'y'
-t каталогкаталог назначения заранее, остальные аргументы — источники (удобно с xargs)
-Tсчитать назначение обычным именем: mv -T a b заменит пустой каталог b на a, а не положит a внутрь
-bсохранить заменяемый файл как файл~; --backup=numbered — файл.~1~, файл.~2~…
-S суффикссуффикс резервной копии вместо ~
--no-copyне копировать, если простое переименование невозможно (другая ФС) — сразу ошибка
--strip-trailing-slashesубрать / в конце источников

Переименование или перенос между ФС

Внутри одной файловой системыНа другую файловую систему
Что происходитменяется только запись в каталоге (системный вызов rename)копирование данных + удаление оригинала
Скоростьмгновенно, даже для гигабайткак у cp
inodeсохраняетсяновый
Атомарностьда: другие процессы видят либо старое, либо новое имянет: прерванный перенос оставит частичную копию
-v печатаетrenamed 'a' -> 'b'copied 'a' -> 'b' и removed 'a'

Где граница ФС, покажет df -T путь или stat -c %m путь (точка монтирования).

Примеры

# переименовать файл
mv report.txt report-2024.txt

# перенести несколько файлов в каталог
mv *.log /var/log/archive/

# переименовать каталог (без -r)
mv old_project new_project

# не затирать существующие файлы
mv -n *.conf /etc/myapp/

# спросить перед перезаписью
mv -i draft.txt final.txt

# из find: каталог назначения через -t
find . -name '*.tmp' -print0 | xargs -0 mv -t /tmp/trash/

# атомарная подмена файла: пишем во временный рядом, потом переименовываем
printf 'key=value\n' > /etc/myapp/app.conf.new && mv /etc/myapp/app.conf.new /etc/myapp/app.conf

# массовое переименование: .txt → .md
for f in *.txt; do mv -- "$f" "${f%.txt}.md"; done

Подводные камни

  • Тихая перезапись. Без -i/-n существующий файл с тем же именем заменяется без вопросов.
  • Опечатка в имени каталога. mv file /srv/backpu (каталога нет) не ошибка — файл просто переименуется в backpu. Пиши / в конце (/srv/backup/) или используй -t: тогда несуществующий каталог даст ошибку.
  • Каталог в непустой каталог с тем же именем не сливается: «cannot overwrite 'g/f2': Directory not empty». Для слияния — cp -a src/. dst/ && rm -r src или rsync --remove-source-files.
  • Перенос на другую ФС не атомарен и для больших каталогов долгий; при обрыве останется половина в назначении и всё в источнике.
  • Атомарная подмена работает только в пределах одной ФС. Временный файл создавай в том же каталоге, что и цель, а не в /tmp.
  • Имена, начинающиеся с -, примутся за опции: пиши mv -- -file new или mv ./-file new.

См. также

cp · rm · rsync · ln · find · xargs · stat