На самом деле утилита mv, как правило, применяется для переименования файлов, и тогда ее работа сводится к созданию новых элементов каталогов и уничтожению старых, а реальное копирование может потребоваться только при перемещении файлов между файловыми системами (например, со съемного носителя на постоянный).
По опции -i запрашивается подтверждение перед замещением существующего файла, опция -f влечет отсутствие подобных запросов (по поводу логики запроса подтверждений см. выше описание команды rm).
Приведем пример употребления утилиты mv. Пусть текущий каталог содержит только файлы x и y и пустой каталог d1 (см. пример 4.43). Тогда после выполнения команд, показанных в пример 4.44, будет создан каталог d2, где окажутся файлы x и y, а каталог d1 исчезнет (см. пример 4.45).
.: d1/ x y ./d1:
Листинг 4.43. Состояние текущего каталога перед перемещением файлов.
ls -RF mv x y d1 mv d1 d2 ls -RF
Листинг 4.44. Использование утилиты mv для перемещения файлов и файловых иерархий.
.: d2/ ./d2: x y
Листинг 4.45. Состояние текущего каталога после перемещения файлов.
Продолжим этот пример двумя одинаковыми командами копирования (см. пример 4.46).
cp -R d2 d1 cp -R d2 d1 ls -RF
Листинг 4.46. Применение утилиты cp для копирования файловых иерархий.
Первая команда скопирует иерархию с корнем d2 во вновь созданный каталог d1, вторая - под d1 (с сохранением имени d2 для корня копии). Результат показан в пример 4.47.
.: d1/ d2/ ./d1: d2/ x y ./d1/d2: x y ./d2: x y
Листинг 4.47. Результат использования утилиты cp для копирования файловых иерархий.
Для перемещения (переименования) одного файла служит функция rename() из репертуара C99 (см. пример 4.48).
#include <stdio.h> int rename (const char *old_path, const char *new_path);
Листинг 4.48. Описание функции rename().
Функция rename() обладает частью функциональности служебной программы mv. Она не перемещает файловых иерархий и не раскрывает символьных ссылок, если их имена заданы в качестве аргументов.