71

Что произойдет, если команда Linux mv будет прервана? Скажем, я перемещаю весь каталог в другое место и прерываю его, пока он движется. Будет ли исходный каталог еще не тронут?

7 ответов7

48

Если вы перемещаете каталог в той же файловой системе, вы перемещаете запись каталога только из одного места в файловой системе в другое. Например, mv /source/dir /target/dir удалит запись каталога dir из /source и создаст новую в /target . Это делается одним атомным системным вызовом (то есть непрерывным). inode , содержащий записи каталога из dir а также фактическое содержание самого каталога не влияет.

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

31

Реализация GNU перебирает аргументы в командной строке, сначала пытается переименовать, а в случае неудачи рекурсивно копирует, а затем рекурсивно удаляет источник. Так

mv a b c/

удалит a перед копированием b, и не начнет удалять что-либо в a до завершения целевой копии.

Обратите внимание, что это относится только к реализации GNU.

Чтобы уточнить: если a является каталогом, содержащим d и e, а b является файлом, порядок будет

  • создать с / а
  • копировать а / д -> с / а / д
  • скопировать / e -> c / a / e
  • удалить а / д
  • удалить а / е
  • удалить
  • копия b -> c / b
  • удалить б
12

Вы перемещаете один каталог, прерываете перемещение, и исходный каталог остается неизменным:

$ mv a b/

Если вы переместите несколько каталогов, каждый из них будет не поврежден ни в источнике, ни в месте назначения, в зависимости от того, когда вы прервали:

$ mv a b c/

Как я получил свой ответ:

$ mv --version
mv (GNU coreutils) 8.21

$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals.  If the copy fails, then the part
that was copied to the destination partition is removed.  If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.

В качестве теста я скопировал большую папку в каталог NFS, прервался, и количество файлов в моей большой исходной папке осталось прежним, а частичное содержимое осталось в каталоге NFS. Я использовал "find. -Type f | wc -l" для проверки.

Похоже, что ответ Саймона правильный.

9

Принятый ответ определенно не верен в отношении перемещения между файловыми системами - этот факт уже несколько раз спас меня от проблем. При перемещении каталога, содержащего подкаталоги, ни один файл в подкаталоге не будет удален до того, как будет скопирован весь подкаталог. Это, между прочим, фактическое значение "объект за объектом" - подкаталог является объектом (файлом), и поэтому его целостность должна быть сохранена полной копией в месте назначения, прежде чем что-либо может быть удалено. Таким образом, ответ Саймона представляется мне правильным.

4

Нет. Mv управляет объект за объектом, поэтому объекты, которые уже были обработаны, будут удалены из источника.

2

Если вы хотите прервать mv, потому что хотите отключиться от терминала, вы можете просто отправить его в фоновый режим:

* press Ctrl+Z

# bg
# disown
2

Определенно нет. Движение производится объект за объектом. Следовательно, объект, перемещенный к месту назначения до точки прерывания, больше не должен существовать в источнике.

Если mv был выдан для большого файла (между разными), и он был прерван, то источник не будет поврежден. На цели вы увидите неполный файл вплоть до точки прерывания.

Однако вы можете восстановить mv с помощью той же команды, и процесс продолжится.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .