Чи краще завжди копіювати та видаляти, а не рухатись?


18

Взагалі кажучи, я відчуваю паніку, коли розумію, що якщо я скасую переміщення файлу, це може призвести до неповної цілі або джерела. Це питання стосується платформ на базі Windows та Unix. Я ніколи не можу точно згадати, як працює команда move в будь-якому випадку. Наприклад, якщо ви переміщуєте каталог; чи він копіює весь каталог, а потім видаляє його після, або він копіює та видаляє кожен файл окремо?

Я завжди розумію, після введення чогось подібного mv verybigdir dest, що, можливо, я мав би набрати cp -R verybigdir dest  &&  rm -R verybigdir(де &&оператор переходить до наступної команди, лише якщо перша була успішною) - чи це безглуздо? Що саме відбувається, коли я натискаю Ctrl+ Cнаполовину через рух? Так само, що саме відбувається в Windows, коли я натискаю кнопку скасувати?

Я не можу підрахувати, скільки разів я щось перемістив (востаннє, коли користувався svn) та мав два каталоги із розділеним вмістом. Я думаю, що відповідь складна, оскільки не всі програми переміщують групи файлів однаково.


16
Що б ви не робили, просто не видаляйте спочатку.
mtone

@monotone Веселий +1
Нік Болтон

Відповіді:


10

У Windows переміщення на той же диск та розділ буде діяти так само, як команда mv Unix та перейменувати папку або змінити її батьківський. Однак якщо ви перенесли його на інший драйвер чи розділ, він копіював і видаляв файл за файлом, отже, чому ефективніше використовувати файл tar або zip-файл без стиснення, щоб швидше переміщувати файли через розділи та жорсткі диски . Якби ви скасували це, воно просто зупиниться там, де воно є. Я вважаю, що те саме стосується Unix, але я не експериментував з ним достатньо, щоб бути впевненим на 100%. Це лише питання зміни індеї, але якщо він знаходиться на іншому розділі або диску, то його потрібно скопіювати в сектори на цьому розділі або диску. Якщо ви скасували його під час передачі, він уже перемістив би деякі файли, і файл, який передавався, побачить це "

Оновлення. Якщо ви скасували переміщення і хотіли відновити його, просто переоформіть наказ про переміщення. Це може попередити вас, що цільова папка вже існує, але файли не будуть перезаписані (якщо вони не існували до початкового переміщення або додані між двома замовленнями на переміщення), оскільки як тільки вони будуть передані, вони видаляються з джерело (якщо на іншому розділі чи диску).


Ах, я не думав про стиснення.
Нік Болтон

Не потрібно насправді стискати, що може зажадати багато часу. Іноді рівень стиснення 0 (сховище) може зробити роботу з переміщенням великих папок на дисках набагато швидше.
Вовк

"У Windows перехід на один і той же диск і розділ буде діяти так само, як команда mv Unix і перейменовувати папку або змінити її батьківський." - При використанні Windows Explorer це неправда. Це багато лайно, це займає віки, і ви можете закінчитися вмістом, розділеним на два каталоги, дивіться цю відповідь на моє запитання .
maaartinus

@maaartinus Насправді, як працює Провідник Windows, він викопує рекурсивно в папках, а не змінює батьківський вузол. Ви маєте рацію, хоча для Windows Explorer це не просто атомний хід. Я припускав, що командний рядок використовується, я повинен був запитати.
Вовк

11

Навіть на ідеально стабільному комп’ютері, який ніколи не виходить з ладу: якщо ви дбаєте про часові позначки, то mvце краще, ніж звичайний cp.

( cp -aзбереже часові позначки для вас, і я припускаю, що щось подібне існує в Windows).


1
Ага, часові позначки. Я цього не вважав! +1
Нік Болтон

Чи справді важливі чесні позначки навіть чесно ...
Марцін

1
@Marcin, вони там чомусь, якщо це те, про що ти питаєш ...
macek

10

Ні.

Пояснення:

mv verybigdir dest

перейменовує дужебігдір на dest. Це атомна операція, тобто не може провалитися на півдорозі.

Якщо dest на іншому пристрої, mv скопіює спочатку, а потім видалить стару версію. Це не атомна операція. Якщо це не вдасться, у вас може бути лише часткова копія Verybigdir у dest, але Verybigdir все одно буде повною.

Так, інші програми можуть переміщувати файли по-різному.


2
Насправді, я думаю, що mv на Linux копіює / видаляє кожен файл або каталог окремо, а не копіює все дерево до місця призначення, а потім видаляє все дерево з джерела ... тож якщо ви скасуєте на півдорозі, ви закінчитеся з деяким файли в обох місцях, і жоден каталог не буде повним.
пограбувати

3
@rob: Ні. Каталоги - це файли, як і будь-які інші, і обробляються однаково. Поведінка, про яку ви говорите, досягається mv verybigdir/* dest.
dmckee --- кошеня колишнього модератора

2
В основному, mv обробляє кожен аргумент "cp && rm" способом ... mv verybigdir/* destрозбиває mv дужеbigdir на безліч окремих операцій переміщення. Завжди пам’ятайте, що на відміну від Windows, програма / інструмент Linux не бачить, що там «*» він розширений оболонкою.
Юрген А. Ерхард

4

У Windows я завжди копіюю та видаляю, а не рухаюся. Я колись переміщував файли, і саме тут я вперше помітив погану пам'ять. Під час переміщення файлу він зупинився між ними, і я отримав помилку, тому я перевірив вихідну папку, і файл зник, потім я перевірив призначення, і там був пошкоджений файл. Це траплялося частіше з файлами більшого розміру, і більшість з них були завантаженнями, які займали години, тому я рекомендую скопіювати та видалити. Економте собі час на початку, він окупиться в кінці кінців.


3

У unix, при ходах, які не перетинають межі файлової системи, mvне копіюється дані: він просто оновлює базу даних inode в різних каталогах. Це набагато швидше, ніжcp на великих файлах.

Далі, використовуючи mv через межі файлової системи просто мовчки викликає механізм копіювання та видалення.

Тому я думаю, що вам слід віддати перевагу mv.


Приємно підсумував.
Нік Болтон

"механізм копіювання та видалення" можна інтерпретувати як "скопіювати кожен файл, потім видалити його" або "скопіювати всі файли, а потім видалити всі".
j_random_hacker

2

Принаймні, в Windows переміщення - це просто більш автоматизоване копіювання та видалення. Я вважаю, що mv переміщує кожен файл окремо, тобто ^ c-ing не втратить жодного файлу, ви просто в кінці файлів розділитеся на два місця - на відміну від Windows Explorer, який скасує все, коли він скасується.

Моє рішення для цього: ніколи не рухайтесь, якщо я не впевнений, що хочу перенести це.


1

Якщо ви використовуєте ACL у вихідній файловій системі, але не в цільовому пункті призначення, mv в Linux буде копіювати джерело, а потім - через неможливість встановити ACL-адреси в пункт призначення - зупинити. Отже, у вас є файл з обох сторін. У режимі mv немає перемикача, щоб запобігти такій поведінці, тому в цьому випадку краща cp && rm.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.