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.