mv가 cp보다 훨씬 빠른 이유는 무엇입니까? 잘못된 mv 명령을 복구하는 방법은 무엇입니까?

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

그리고 그것은 영원히 걸립니다 ...

어떻게 해야 합니까?

그건 그렇고, 다음은 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'

답변1

디렉토리가 다음과 같은 경우움직이는동일한 파일 시스템(동일한 파티션) 내에서 디렉터리의 파일 경로 이름을 바꾸면 됩니다. 디렉토리 자체의 디렉토리 항목을 제외하고는 데이터를 변경할 필요가 없습니다.

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

디렉토리 이동~ 사이파일 시스템에는 데이터를 대상으로 복사하고 소스에서 제거하는 작업이 포함됩니다. 단일 파일 시스템에서 데이터를 복제(복제)하는 만큼 오랜 시간이 걸립니다.


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

답변2

기존 답변은 훌륭하지만 파일을 이동하고 복사할 때 어떤 일이 발생하는지 정확하게 보여줌으로써 답변을 조금 확장하고 싶습니다. 복사하는 동안 시스템 호출을 보면 다음을 볼 수 있습니다.

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. 시스템 호출 추적은 첫 번째 추적과 동일하지만 끝에 있습니다 unlink("hello1.txt"). 이는 소스와 대상이 동일한 파일 시스템에 있는 경우에만 이름 바꾸기를 사용하여 파일을 이동할 수 있기 때문입니다.

관련 정보