왜 mv가 cp보다 훨씬 빠릅니까? 잘못된 mv 명령을 어떻게 복구합니까? 수십만 개의

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

그리고 기다릴 때까지 영원히 필요합니다 …

어떻게해야합니까?

BTW, 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'


답변

디렉토리가 동일한 파일 시스템 (동일한 파티션) 내에서 이동 되면 필요한 것은 디렉토리의 파일 경로 이름을 바꾸는 것입니다. 디렉토리 자체의 디렉토리 항목 이외의 데이터는 변경하지 않아도됩니다.

디렉토리를 복사 할 때 각각 및 모든 파일의 데이터를 복제해야합니다. 여기에는 모든 소스 데이터를 읽고 대상에서 쓰는 것이 포함됩니다.

파일 시스템 간에 디렉토리 이동 하면 데이터를 대상으로 복사하고 소스에서 제거해야합니다. 단일 파일 시스템 내에서 데이터를 복사 (복제)하는 데 시간이 오래 걸립니다.


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하위 폴더로 디렉토리).


답변

기존 답변은 훌륭하지만 파일을 복사 할 때와 움직일 때 발생하는 상황을 정확하게 표시하여 조금 확장하고 싶습니다. 복사하는 동안 syscall을 보면 다음이 표시됩니다.

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

소스 파일이 열리고 두 번째 파일이 생성됩니다. 그런 다음 소스 파일의 내용을 메모리로 읽고 해당 메모리를 대상 파일에 씁니다. 이를 위해서는 몇 개의 컨텍스트 스위치와 일부 파일이 필요한 큰 디스크 I / O가 필요합니다. 그러나 파일을 이동하면 다음이 표시됩니다.

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

파일이 동일한 물리 디스크의 동일한 파티션에있는 경우에만 파일 이름이 바뀌는 것을 볼 수 있습니다. 거대한 멀티 기가 바이트 파일을 만든 다음 집의 두 위치간에 이동하면 작업이 즉시 완료됩니다. 반면에 외부 장치로 이동하면 cp대신 사용 하는 것처럼 이동하는 데 시간이 오래 걸립니다 . 파일 이동은 동일한 파티션에있는 경우 이름을 변경해야만 수행 할 수 있기 때문입니다.