Есть ли какая-то разница между mv и {cp + rm старый файл} в Unix?

13
  • mv a b

  • cp a b;rm a

Это два набора утверждений. Есть ли какая-то разница между тем, что они делают?

Lazer
источник
1
атомарность? Я действительно не знаю, является ли команда mv атомарной.
Адриано Вароли Пьяцца
Да. Почему ты спрашиваешь?
1
Теперь mvон аналогичен ln+ rm, хотя первый будет работать для перемещений между файловыми системами (который затем просто становится cp+ rm), тогда как последний не будет выполняться при ln(который не поддерживает жесткие ссылки между файловыми системами).
Крис Шут-Янг
Каждый день - школьный день - для всех, кто придет в себя, задаваясь вопросом, как переопределить это поведение по умолчанию, вам нужен --remove-destinationпереключатель - stackoverflow.com/a/9371263/409638
Роберт

Ответы:

20

Предполагая, что файлы находятся в одной и той же файловой системе, mv просто меняет указатели в файловой системе, тогда как cp копирует все содержимое файла, а rm снова меняет указатели. Так что мв намного эффективнее.


источник
но они делают то же самое, верно?
Lazer
8
Нет, они не
2
@eSKay: Нет. Два сценария: 1. Цель не существует. mvпросто переименовывает файл (тот же индекс, что и у исходного файла). cpделает новый индекс для нового файла. 2. Цель существует. mvотсоединяет (удаляет) целевой файл и переименовывает его за один шаг. cpперезаписывает inode целевого файла.
Крис Шестер-Янг
7
Также mvникогда не изменяет разрешение или право собственности. Представьте, что вы хотите переместить файл из домашнего каталога вашего собеседника в ваш собственный домашний каталог. Если вы mvэто сделаете, вы получите файл в вашем домашнем каталоге, который принадлежит вашему собеседнику. Вы не можете chownили chmodи в зависимости от разрешений даже не изменять и не читать. Если вы cpпоследуете, rmфайл будет принадлежать вам, и все в порядке.
Людвиг Вайнцерль
9

Да, у mv есть шанс быть атомарным на том же диске, тогда как комбинация cp и rm никогда не имеет.

Это предполагает, что mv реализован с использованием rename(), что является вызовом, который имеет гарантию. Посмотрите, например, этот пост группы новостей , который цитирует POSIX:

Эта функция rename () эквивалентна для обычных файлов тем, которые определены стандартом ISO C. Его включение здесь расширяет это определение для включения действий над каталогами и определяет поведение, когда новый параметр называет файл, который уже существует. Эта спецификация требует, чтобы действие функции было атомарным.

размотать
источник
7

В той же файловой системе mv изменяет ссылку на каталог, указывая на один и тот же индекс (данные файла и метаданные) таким образом:

  • является атомарной операцией (она не может быть прервана другой операцией над файлом процесса)
  • занимает всего тривиальное количество дополнительного дискового пространства (дополнительное имя в каталоге)
  • сохраняет права доступа к файлам и права собственности
  • может быть намного быстрее, в зависимости от объема данных

Скопируйте и удалите

  • не атомарный (другой процесс может вмешиваться между командами cp и rm)
  • требует краткого хранения данных файла на диске в течение короткого периода времени (между командами cp и rm)
  • изменяет права доступа к файлу и владельца по умолчанию
  • может быть намного медленнее или даже потерпеть неудачу, в зависимости от объема данных
mpez0
источник
4

Когда источник и место назначения находятся на одном физическом томе, тогда первый подход - это просто переименование и очень быстрое (даже если файлы очень большие).

cp& rmвсегда будет загружать / хранить все данные, даже если в этом нет необходимости.

Йоахим Зауэр
источник
3

милливольт по сути является операцией переименования. Это означает, что сам файл остается в том же месте на диске. Фактическая файловая операция не выполняется.

Филипп Лейбер
источник
2

Да.

mv просто изменяет метаданные файловой системы в файле, относящиеся к его имени и расположению, тогда как cp создает отдельную копию файла, что занимает гораздо больше времени, так как он должен полностью прочитать первый файл и затем записать его содержимое в другой файл.

анонимный трус
источник
2

cp и rm намного тяжелее используют диск и могут перестать работать из-за дискового пространства.

Офир
источник
2

Разница в том, что mv сохраняет атрибуты файла, а cp по умолчанию - нет, например, устанавливает дату создания на текущую дату.

Чтобы переопределить это значение по умолчанию, используйте «cp -p» для сохранения последней модификации данных, времени последнего доступа, идентификатора пользователя и идентификатора группы (только если у него есть разрешения для этого), биты разрешения файла и SUID и SGID биты.

harrymc
источник