왜 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

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

어떻게해야합니까?

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'

37
아, 오류 메시지의 가장 유용한, received failure with description 'Failure'.
Captain Man

3
터미널로 이동하여 명령을 입력하십시오 mv /root/some_other_folder/big_folder /root/big_folder. 어떤 오류 메시지가 나타 납니까?
ctrl-alt-delor

나는 아마 함께 갈 것이다cp -al
Nemo

1
OP의 mv vs cp질문은 해결되었지만 폴더가 한 방향으로 즉시 다른 방향으로는 움직일 수 없었던 이유를 듣고 싶습니다.
user1717828

4
본질적으로 책의 사본을 만드는 것보다 한 방에서 다른 방으로 책을 옮기는 것이 훨씬 빠르다는 동일한 이유로.
David Richerby

답변:


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 "Failure"는 불행히도 좋은 오류 설명이 아닙니다. 홈 디렉토리에 mv ~/some_other_folder/big_folder ~/다른 것이 없는지 확인한 후에 사용했을 것 big_folder입니다. FileZilla를 사용한 적이 없습니다.
Kusalananda

10
Unix에서 파일 유지 관리를 수행하기 위해 Windows GUI 도구에 의존하지 않는 또 다른 이유.
마크 스튜어트

4
@MarkStewart 당신의 코멘트의 끝에 왜“유닉스”입니까?; 좋은 생각 일 때가 있습니까?
ctrl-alt-delor

11

기존 답변은 훌륭하지만 파일을 복사 할 때와 움직일 때 발생하는 상황을 정확하게 표시하여 조금 확장하고 싶습니다. 복사하는 동안 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대신 사용 하는 것처럼 이동하는 데 시간이 오래 걸립니다 . 파일 이동은 동일한 파티션에있는 경우 이름을 변경해야만 수행 할 수 있기 때문입니다.


OP가 파일이 아닌 디렉토리를 이동했습니다.
AL

영업 이익은 어떤 파일이 포함되지 않은 유일한 경우 일 것입니다 빈 폴더를 이동하지 않는 한 그것은 여전히 상점을 적용 되는가
설탕을 친

@AL 유닉스 계열 시스템에서는 모든 것이 파일입니다.
Thegs

@AL 텍스트 파일은 단지 예일뿐입니다. 디렉토리의 유일한 차이점은 일부 getdents()mkdir()호출이 뿌려진 다는 것입니다 .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.