Что произойдет, если команда Linux mv
будет прервана? Скажем, я перемещаю весь каталог в другое место и прерываю его, пока он движется. Будет ли исходный каталог еще не тронут?
72
Если вы перемещаете каталог в той же файловой системе, вы перемещаете запись каталога только из одного места в файловой системе в другое. Например, mv /source/dir /target/dir
удалит запись каталога из dir
from /source
и создаст новую в /target
. Это делается одним атомным системным вызовом (то есть непрерывным). Индекс, содержащий записи каталога, dir
а также фактическое содержимое самого каталога, не затрагивается.
Если вы перемещаете каталог из одной файловой системы в другую, все файлы сначала копируются в новую файловую систему, а затем отсоединяются от исходной. Поэтому, если вы прервете mv
во время копирования, вы можете получить две копии некоторых файлов - в старом месте и в новом.
fsck
(который, скорее всего, будет запускаться автоматически при перезагрузке, поскольку диск не был размонтирован без ошибок).strace mv /fs1/dir /fs2/
- самое последнее, что делает mv - это вызовunlinkat
всех исходных файлов одновременно (не один за другим, когда они копируются).Реализация GNU перебирает аргументы в командной строке, сначала пытается переименовать, а в случае неудачи рекурсивно копирует, а затем рекурсивно удаляет источник. Так
удалит a перед копированием b и не начнет удалять что-либо в a до завершения целевой копии.
Обратите внимание, что это относится только к реализации GNU.
Чтобы уточнить: если a является каталогом, содержащим d и e , а b является файлом, порядок будет
источник
mv
, поэтому оно не только для GNU.Вы перемещаете один каталог, прерываете перемещение, и исходный каталог остается неизменным:
Если вы переместите несколько каталогов, каждый из них будет не поврежден ни в источнике, ни в месте назначения, в зависимости от того, когда вы прервали:
Как я получил свой ответ:
В качестве теста я скопировал большую папку в каталог NFS, прервался, и количество файлов в моей большой исходной папке осталось прежним, а частичное содержимое осталось в каталоге NFS. Я использовал "find. -Type f | wc -l" для проверки.
Похоже, что ответ Саймона правильный.
источник
Принятый ответ определенно неверен в отношении перемещения между файловыми системами - этот факт уже несколько раз спас меня от проблем. При перемещении каталога, содержащего подкаталоги, ни один файл в подкаталоге не будет удален до того, как будет скопирован весь подкаталог. Это, между прочим, фактическое значение «объект за объектом» - подкаталог является объектом (файлом), и поэтому его целостность должна быть сохранена полной копией в месте назначения, прежде чем что-либо может быть удалено. Таким образом, ответ Саймона представляется мне правильным.
источник
Нет. Mv управляет объект за объектом, поэтому объекты, которые уже были обработаны, будут удалены из источника.
источник
Определенно нет. Движение производится объект за объектом. Следовательно, объект, перемещенный к месту назначения до точки прерывания, больше не должен существовать в источнике.
Если mv был выдан для большого файла (между разными) и он был прерван, то источник не будет поврежден. На цели вы увидите неполный файл до момента прерывания.
Однако вы можете восстановить mv с помощью той же команды, и процесс продолжится.
источник
Если вы хотите прервать mv, потому что хотите отключиться от терминала, вы можете просто отправить его в фоновый режим:
источник