16

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

Я всегда понимаю, после ввода чего-то вроде mv verybigdir dest , что, возможно, мне следовало набрать cp -R verybigdir dest  &&  rm -R verybigdir (где оператор && переходит к следующей команде, только если первая была успешной) - или это бессмысленно? Что именно происходит, когда я нажимаю Ctrl+C в середине хода? Кроме того, что именно происходит в Windows, когда я нажимаю кнопку отмены?

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

7 ответов7

11

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

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

10

В Windows переход на один и тот же диск и раздел будет действовать так же, как команда mv в Unix, и переименовывает папку или меняет ее родителя. Однако, если бы вы переместили его на другой драйвер или раздел, он бы копировал и удалял файл за файлом, поэтому более эффективно использовать tar-файл или zip-файл без сжатия для более быстрого перемещения файлов между разделами и жесткими дисками , Если бы вы отменили его, он просто остановился бы там, где он есть. Я полагаю, что то же самое верно для Unix, но я недостаточно экспериментировал с этим, чтобы быть на 100% уверенным. Это просто вопрос изменения inode, но если он находится на другом разделе или диске, его нужно скопировать в сектора этого раздела или диска. Если вы отмените его во время передачи, он уже переместит некоторые файлы, и файл, который был передан, увидит, что его целевой файл удален, а исходный файл сохранен (транзакция отменена, но ваш исходный файл все еще существует).

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

9

Нет.

Объяснение:

mv verybigdir dest

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

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

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

4

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

3

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

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

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

2

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

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

1

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

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