Відповіді:
Якщо ви переміщаєте каталог в одній і тій же файловій системі, ви переміщуєте запис каталогу лише з одного місця файлової системи в інше. Наприклад, mv /source/dir /target/dir
видалить запис каталогу dir
з /source
і створить новий в /target
. Це робиться одним викликом атомної системи (тобто безперебійним). Вплив, що містить записи каталогів dir
, а також власне вміст самого каталогу не впливає.
Якщо ви переміщуєте каталог з однієї файлової системи в іншу, всі файли спочатку копіюються в нову файлову систему, а потім відключаються від вихідної. Тож якщо ви перервете mv
під час його копіювання, ви можете отримати дві копії деяких файлів - на старому місці та на новому.
strace mv /fs1/dir /fs2/
- саме останнє, що робить mv - це викликати unlinkat
всі вихідні файли одразу (не по черзі, як вони копіюються).
Реалізація GNU повторює аргументи в командному рядку, намагається спершу перейменувати, а якщо це не вдасться, рекурсивно копіює та рекурсивно видаляє джерело. Тому
mv a b c/
видалить a перед копіюванням b , і не почне видаляти нічого в a до завершення цільової копії.
Зауважте, що це стосується лише реалізації GNU.
Для уточнення: якщо a - це каталог, що містить d і e , а b - файл, буде порядок
mv
, тому це не лише GNU.
Ви перемістите один каталог, перервете переміщення, і початковий каталог залишиться недоторканим:
$ 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. -Тип f | wc -l".
Схоже, відповідь Саймона правильна.
Прийнята відповідь, безумовно, помилкова в переході між файловими системами - факт, який врятував мені багато клопотів уже пару разів. При переміщенні каталогу, який містить підкаталоги, жоден файл у підкаталозі не буде видалений до того, як буде скопійовано весь підкаталог. Це, однак, власне значення "об'єкт за об'єктом" - підкаталог IS є об'єктом (файлом), і, таким чином, його цілісність повинна бути збережена повною копією в пункті призначення, перш ніж щось можна буде видалити. Тож відповідь Саймона видається мені правильною.
№ mv оперує об'єктом за об'єктом, тому об'єкти, які вже були оброблені, будуть видалені з джерела.
Однозначно ні. Переміщення робиться об'єктом за об'єктом. Отже, об’єкт, переміщений до пункту призначення аж до точки переривання, вже не буде існувати у джерелі.
Якщо mv був виданий для великого файлу (між різними) і він був перерваний, джерело буде недоторканим. На цілі ви побачите неповний файл до моменту переривання.
Однак ви можете відновити mv за допомогою тієї ж команди, і процес триватиме.
Якщо ви хочете перервати mv через відключення від терміналу, можете просто надіслати його на другий план:
* press Ctrl+Z
# bg
# disown
fsck
(який, швидше за все, запуститься автоматично при перезавантаженні, оскільки диск не був відключений чисто).