Чому 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'

37
Ах, найбільш корисних повідомлень про помилки received failure with description 'Failure'.
Людина капітана

3
Перейдіть до терміналу і введіть команду mv /root/some_other_folder/big_folder /root/big_folder. Яке повідомлення про помилку ви отримуєте?
ctrl-alt-delor

Я, мабуть, пішов би зcp -al
Немо

1
mv vs cpПитання ОП вирішено, але я хотів би почути, чому він зміг миттєво переміщати папку в одному напрямку, а не в інший.
користувач1717828

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 Так, правильно.
Kusalananda

4
@AGamePlayer "Невдача", на жаль, не є хорошим описом помилок. Я б використав, mv ~/some_other_folder/big_folder ~/переконавшись, що big_folderв домашньому каталозі немає іншого . Я ніколи не використовував FileZilla.
Kusalananda

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 не переміщує порожні папки, це був би єдиний випадок, коли жодні файли не задіяні
загляньте

@AL У Unix-подібних системах все є файлом.
Теги

@AL Текстовий файл був лише прикладом. Єдина відмінність каталогу - це те, що вам потрібно було б розсипати деякі дзвінки getdents()та mkdir()дзвінки.
ліс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.