Лучше всегда копировать и удалять, чем перемещать?

18

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

Я всегда понимаю, после ввода чего-то подобного 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% уверенным. Это просто вопрос изменения inode, но если он находится на другом разделе или диске, его необходимо скопировать в сектора этого раздела или диска. Если бы вы отменили его во время передачи, он уже переместил бы некоторые файлы, и файл, который был передан, увидит его ».

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

волк
источник
Ах, я не думал о сжатии.
Ник Болтон
Вам не нужно сжимать, что может потребовать много времени. Иногда уровень сжатия 0 (хранилище) позволяет быстрее перемещать большие папки между дисками.
Волк
«В Windows переход на один и тот же диск и раздел будет действовать так же, как команда mv в Unix, и переименовывает папку или меняет ее родителя». - При использовании Windows Explorer это не так. Это много дерьма, это занимает много времени, и вы можете получить контент, разделенный на две директории, см. Этот ответ на мой вопрос .
Maaartinus
@maaartinus На самом деле Windows Explorer работает так, что он рекурсивно копает в папках, а не меняет родительский узел. Вы правы, хотя для Windows Explorer это не просто атомный ход. Я предполагал, что командная строка используется, я должен был спросить.
Wolf
11

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

( cp -aсохранит временные метки для вас, и я предполагаю, что нечто подобное существует в Windows).

Арьян
источник
1
Ага, отметки времени. Я не учел это! +1
Ник Болтон
Отметки времени даже важны, если честно ...
Марцин
1
@ Марчин, они там по какой-то причине, если ты об этом и спрашиваешь ...
macek
10

Нет.

Объяснение:

mv verybigdir dest

переименовывает Verybigdir в Dest. Это атомарная операция, т.е. не может провалиться на полпути.

Если dest находится на другом устройстве, mv сначала скопирует, а затем удалит старую версию. Это не атомарная операция. Если это не удастся, у вас может быть только частичная копия verybigdir в dest, но verybigdir все равно будет готов.

Да, другие приложения могут перемещать файлы по-другому.

Тимо Стамм
источник
2
На самом деле, я думаю, что mv в Linux копирует / удаляет каждый файл или каталог по отдельности, а не копирует все дерево в место назначения, а затем удаляет все дерево из источника ... так что если вы отмените его на полпути, вы получите некоторые файлы в обоих местах, и ни один каталог не будет полным.
ограбить
3
@rob: Нет. Каталоги - это файлы, как и любые другие, и обрабатываются так же. Поведение, о котором вы говорите, достигается с помощью mv verybigdir/* dest.
dmckee
2
По сути, mv обрабатывает каждый аргумент способом "cp && rm" ... mv verybigdir/* destразбивает mv of Verybigdir на множество отдельных операций перемещения. Всегда помните, что в отличие от Windows, программа / инструмент Linux не видит, что там "*", она расширяется оболочкой.
Юрген А. Эрхард
4

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

в.
источник
3

В unix при перемещениях, которые не пересекают границы файловой системы, данные mvне копируются: он просто обновляет базу данных inode в различных каталогах. Это намного быстрее чемcp на больших файлах.

Далее, используя mv границ файловой системы просто вызывает механизм копирования и удаления.

Поэтому я думаю, что вы должны предпочесть mv.

dmckee
источник
Красиво подытожил.
Ник Болтон
«Механизм копирования и удаления» можно интерпретировать как «скопировать каждый файл, затем удалить его» или «скопировать все файлы, а затем удалить их все».
j_random_hacker
2

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

Мое решение этого: никогда не двигаться, если я не уверен, что хочу переместить это.

Phoshi
источник
1

Если вы используете ACL в исходной файловой системе, но не в месте назначения, mv в Linux скопирует источник и затем - из-за невозможности установить ACL в месте назначения - остановится. Таким образом, вы получите файл с обеих сторон. В mv нет переключателя для предотвращения такого поведения, поэтому в этом случае cp && rm предпочтительнее.

uli42
источник