mv가 중단되면 어떻게됩니까?


72

Linux mv명령이 중단 되면 어떻게됩니까 ? 전체 디렉토리를 다른 곳으로 옮기고 이동하는 동안 중단하십시오. 소스 디렉토리가 여전히 변경되지 않습니까?

답변:


51

당신이 디렉토리로 이동하면 동일한 파일 시스템을, 당신은 단지 또 하나의 파일 시스템의 한 위치에서 디렉토리 항목을 이동합니다. 예를 들면, mv /source/dir /target/dir의 디렉토리 항목이 삭제됩니다 dir에서을 /source하고 새로운 하나를 만들 /target. 그것은 하나의 원자 시스템 호출 (즉, 중단 불가능)에 의해 수행됩니다. dir디렉토리 자체의 실제 내용뿐만 아니라 디렉토리 항목을 포함하는 inode 는 영향을받지 않습니다.

한 파일 시스템에서 다른 파일 시스템으로 디렉토리를 이동하면 모든 파일이 먼저 새 파일 시스템으로 복사 된 다음 원래 파일 시스템에서 링크 해제됩니다. 따라서 mv복사하는 동안 중단 하면 이전 위치와 새 파일에 일부 파일의 사본 두 개가 생길 수 있습니다.


6
@Wesley : 아니요. 부분 파일이 없습니다. 시스템이 계속 켜져 있으면 (예 : ctrl-C를 누르는 경우) 자동으로 제거됩니다. 그렇지 않으면 (예 : 전원 손실) 부분 파일이 대상 디스크에서 액세스 할 수없는 곳에 남아있을 수 있지만 다음 파일로 정리해야합니다 fsck(디스크가 깨끗하게 마운트 해제되지 않았기 때문에 재부팅시 자동으로 실행 됨).
Dave Sherohman

50
잘못된. dir을 한 fs에서 다른 mv / fs1 / dir / fs2 /로 이동하고 인터럽트하면 / fs1 / dir /이 여기에 완전히 남아 있습니다. / fs1 / dir은 이동이 완료된 경우에만 제거됩니다.

8
user263131이 맞습니다. 실행 strace mv /fs1/dir /fs2/- 매우 마지막 MV가하는 호출한다 unlinkat(그들은 복사로 하나없는 한) 한 번에 모든 소스 파일을합니다.
Jakob

7
@JJ bash 확장을 사용했기 때문입니다.이 경우 mv는 확장의 각 파일을 별도의 소스로 취급하므로 개별적으로 수행합니다.
gkanwar

5
그래서 ... @ bmk 또는 다른 사람들은이 대답을 덜 덜 잘못 업데이트 하시겠습니까?
Artem Russakovskii

35

GNU 구현은 명령 행에서 인수를 반복하고 먼저 이름을 바꾸려고 시도하고, 실패하면 재귀 적으로 소스를 복사 한 후 재귀 적으로 삭제합니다. 그래서

mv a b c/

삭제 복사하기 전에 B를 , 그리고 아무것도 삭제 시작되지 않습니다 대상 복사가 완료되기 전에.

이것은 GNU 구현에만 적용됩니다.

명확히하기 위해 : 경우에 A가 들어있는 디렉토리입니다 DE가 , 그리고 b는 파일입니다, 순서가 될 것입니다

  • c / a 만들기
  • 복사 a / d-> c / a / d
  • 복사 a / e-> c / a / e
  • a / d 삭제
  • a / e 삭제
  • 삭제
  • 복사 b-> c / b
  • b를 삭제

1
이에 대한 소스를 제공 할 수 있습니까? 다른 응답자들은 소스 파일이 다른 fs에 복사 된 직후에 소스 파일이 삭제된다고 말합니다 (즉, 모두가 복사 된 후 모두 삭제되지는 않음).
jamesbtate

1
경험. 내 답변과 다른 답변의 일관성을 더 명확하게하기 위해 예를 추가했습니다. 개별 파일 만 나열하면 실제로 각 파일이 즉시 삭제됩니다.
Simon Richter

macOS 에서이 답변에 설명 된 동작, 즉 BSD mv에서도 작동하므로 GNU 전용이 아닙니다.
kirelagin

12

한 디렉토리를 이동하고 이동을 중단하면 원래 디렉토리는 그대로 유지됩니다.

$ mv a b/

여러 디렉토리를 이동하면 중단 된 시간에 따라 각 디렉토리가 소스 또는 대상에서 그대로 유지됩니다.

$ mv a b c/

내 답변을 얻는 방법 :

$ mv --version
mv (GNU coreutils) 8.21

$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals.  If the copy fails, then the part
that was copied to the destination partition is removed.  If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.

테스트로, 큰 폴더를 NFS 디렉토리에 복사하고 중단했으며 소스 큰 폴더의 파일 수가 동일하게 유지되었고 부분 내용이 NFS 디렉토리에 남아있었습니다. "find. -type f | wc -l"을 사용하여 확인했습니다.

시몬의 대답이 맞는 것 같습니다.


9

받아 들여진 대답은 파일 시스템 간 이동에 대해 분명히 잘못되었습니다. 사실 이미 몇 번이나 많은 문제를 해결했습니다. 서브 디렉토리가 포함 된 디렉토리를 이동할 때 서브 디렉토리의 파일은 전체 서브 디렉토리가 복사되기 전에 삭제되지 않습니다. 이것은 "개체 별 개체"의 실제 의미입니다. 하위 디렉터리는 개체 (파일)이므로 대상을 삭제하기 전에 대상의 완전한 복사본으로 무결성을 유지해야합니다. 그래서 시몬의 대답은 나에게 맞는 것 같습니다.



2

물론 아니야 개체별로 이동합니다. 따라서 인터럽트 지점까지 목적지로 이동 한 객체는 더 이상 소스에 존재하지 않아야합니다.

큰 파일 (다른 파일 간)에 대해 mv가 발행되었고 중단 된 경우 소스는 손상되지 않습니다. 대상에서 중단 지점까지 불완전한 파일이 표시됩니다.

그러나 동일한 명령으로 mv를 복원하면 프로세스가 계속됩니다.


2

터미널에서 연결을 끊고 mv를 중단하려면 백그라운드로 보내십시오.

* press Ctrl+Z

# bg
# disown

1
좋은 지적이지만 실제 질문에 대답하지 않습니다.
Julie Pelletier

1
@JuliePelletier,하지만 내가 찾던 것이기 때문에 누군가가 이것을하는 데 관심이있을 수 있습니다.
Курочка Ряба
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.