Почему mv намного быстрее чем cp? Как мне восстановиться после неверной команды mv?

17

Я перетаскиваю папку в другую по ошибке в FileZilla.

~/big_folder
~/some_other_folder

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

То, что так странно, - то, что после того, как я отпускаю свою мышь, движение закончено. Папка «big_folder» перемещена в «some_other_folder».

~/some_other_folder/big_folder

(нет big_folderв ~/после переезда)

Затем я осознаю ошибку и пытаюсь вернуться назад, но она не работает как на FileZilla, так и на терминале.

Затем я должен cp -rскопировать файлы обратно, потому что есть серверные коды, обращающиеся к этим файлам в~/big_folder

И это требует, как вечно ждать ...

Что я должен делать?

Кстати, вот вывод из FileZilla (это ошибка возврата):

Status:       Renaming '/root/big_folder' to '/root/some_other_folder/big_folder'
Status:       /root/big_folder -> /root/some_other_folder/big_folder

Status:       Renaming '/root/some_other_folder/big_folder' to '/root/big_folder'
Command:  mv "big_folder" "/root/big_folder"
Error:          mv /root/some_other_folder/big_folder /root/big_folder: received failure with description 'Failure'
AGamePlayer
источник
37
Ах, самое полезное из сообщений об ошибках received failure with description 'Failure'.
Капитан Мэн
3
Перейдите в терминал и введите команду mv /root/some_other_folder/big_folder /root/big_folder. Какое сообщение об ошибке вы получаете?
Ctrl-Alt-Delor
Я бы, наверное, пошел сcp -al
Nemo
1
mv vs cpВопрос О.П. адресован, но мне бы хотелось услышать, почему он смог мгновенно переместить папку в одном направлении, но не в другом.
user1717828
4
По той же причине, по которой гораздо быстрее переместить книгу из одной комнаты в другую, чем создать копию книги.
Дэвид Ричерби

Ответы:

63

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

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

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


Если FileZilla успешно переименовал каталог из ~/big_folderв ~/some_other_folder/big_folder, то я бы восстановил это, используя

mv ~/some_other_folder/big_folder ~/big_folder

... после того, убедившись в том , что не были директории ~/big_folder(если есть, этот шаг положит big_folderиз some_other_folderв ~/big_folderкаталог в качестве вложенной папки).

Кусалананда
источник
6
Ох ... вот почему я вижу слово "переименование", а не "перемещение" в выводе?
AGamePlayer
2
@AGamePlayer Да, правильно.
Кусалананда
4
@AGamePlayer "Отказ", к сожалению, не является хорошим описанием ошибки. Я бы использовал, mv ~/some_other_folder/big_folder ~/убедившись, что big_folderв домашнем каталоге нет других . Я никогда не использовал FileZilla.
Кусалананда
10
Еще одна причина не зависеть от инструментов графического интерфейса Windows, чтобы выполнять некоторые операции с файлами в Unix.
Марк Стюарт
4
@MarkStewart, почему «в Unix» в конце вашего комментария ?; Есть ли время, когда это хорошая идея?
Ctrl-Alt-Delor
11

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

open("hello1.txt", O_RDONLY)               = 3
open("hello2.txt", O_WRONLY|O_CREAT, 0644) = 4
read(3, "Hello, world!\n", 4096)           = 14
write(4, "Hello, world!\n", 14)            = 14
close(3)                                   = 0
close(4)                                   = 0

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

rename("hello1.txt", "hello2.txt")         = 0

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

лес
источник
ОП переместил каталог, а не файл.
AL
Это все еще применяется, если OP не перемещает пустые папки, что было бы единственным случаем, когда никакие файлы не задействованы
glace
@AL В Unix-подобных системах все является файлом.
Thegs
@AL Текстовый файл был просто примером. Для каталога единственное отличие состоит в том, что у вас есть некоторые getdents()и mkdir()вызовы, разбросанные вокруг.
лес