mv를 계속하는 가장 좋은 방법


13

터미널을 사용하여 한 드라이브에서 다른 드라이브로 파일을 복사했습니다.

sudo mv -vi /location/to/drive1/ /location/to/drive2/

그러나 디렉토리를 만든 후 몇 시간 동안 오류없이 갑자기 중단되었습니다.

그것에 대한 내 자신의 솔루션은 종종 해싱과 비교의 혼합입니다. 이제 어떤 파일이 누락되었는지 (zsh를 위해 매우 긴 하나의 라이너로 작성 됨) 알지 못하고 중간 복사본에서 복구해야하기 때문에 대부분 시간이 많이 걸리는 혼란입니다. 이 스크립트는 작성된대로 bash에서 작동하지 않습니다)

source_directory="/path/to/source_directory/";
target_directory="/path/to/target_directory/";
while read hash_and_file; do {
    echo "${hash_and_file}" | read hash file;
    echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from;
    echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to;
    mv -v "${copy_from}" "${copy_to}" | tee -a log;
    rm -v "${copy_from}" | tee -a log; };
done <<<$(
    comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${source_directory}: :g" | sort;
           ) <( find ${target_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${target_directory}: :g" | sort; ) )

이름 대상 디렉토리 또는 source_directory가 경로의 일부인 경우 오류가 발생하기 쉬우 며 파일이 중복으로 표시되어 이동되지 않은 경우 파일을 삭제하십시오. 또한 결국 디렉토리를 소스하지 않습니다.

중단 된 mv에서 복구하는 가장 좋은 방법이 있습니까?


해싱 대신 사용 하는 비슷한 스크립트를 작성 했습니다cmp . 의존성이 있으며 while readGilles가 언급 한 것과 동일한 문제가 있습니다. 또한 느리고 장황합니다. 그러나 파일이 실행될 때 소스에서 (재) 이동되기 때문에 rsync 방법보다 빠른 디스크 공간을 확보합니다. 용감한 사람들에게 영감을 줄 수 있습니다.
joeytwiddle

3
@joeytwiddle rsync는 다음 --delete-during receiver deletes during the transfer과 같은 유용한 대안을 제공합니다 --delete --delete-before --delete-delay --delete-after --delete-excluded. 따라서 rsync가 최선의 대안입니다
Isaac

뭔가 빠졌을 것입니다. 왜 같은 mv명령을 반복하지 않는가 ? 아마로 *원본 소스가 디렉토리 인 경우 소스 경로에 추가.
jpa December

@isaac 아니, 난 두려워 rsync --delete*재해 ! dest현재에 있지 않은 것을 제거 src하므로 이전 시도에서 성공적으로 이동 한 모든 파일이 이제 삭제됩니다! 당신은 아마 rsync --remove-source-files내가 동의 하는 것이 좋은 대안 것이라고 생각하고 있었을 것입니다 . ( more1 , more2 )
joeytwiddle

@joeytwiddle 아니, rsync --delete것입니다 제거 다른 소스의 일부가 아닌 파일을. [man rsync] () *에서 불필요한 디렉토리에서 불필요한 파일을 삭제합니다 *. 불필요한 의미 이해 : 동기화되지 않음. 그리고 rsync 소스 파일이 올바르게 전송 된 후 소스 파일을 제거하는 방법 제공합니다.
Isaac

답변:


46

rsync를 재발 명하는 것을 잊고 rsync를 사용하십시오.

sudo rsync -av /location/to/drive1/ /location/to/drive2/

소스에 슬래시를 사용하십시오. 그렇지 않으면 /location/to/drive2/drive1 . .

명령이 성공했는지 다시 확인한 후 다음을 실행하십시오. rm -rf /location/to/drive1/ .

위의 명령은에서 기존 파일을 덮어 씁니다 drive2. drive2와 같이 이미 존재하는 파일을 건너 뛰도록 사용자에게 프롬프트하려면 mv -i이미 복사 된 파일과 아직 복사되지 않은 파일을 구별해야하므로 더 복잡합니다. --ignore-existing내용에 관계없이 대상에 이미 존재하는 파일을 건너 뛰려면 rsync 옵션을 전달할 수 있습니다 . 원본의 경우mv파일을 작성하는 도중에 이 중단 된 경우이 파일은 복사 된 상태 (반복 rsync -a이 제대로 완료된 상태 )로 유지됩니다.

당신이의 정확한 행동을 재현하려는 경우 mv -i프롬프트를 포함하여 수행 할 수 있지만 훨씬 더 복잡합니다.

1 거인 라이너는 매우 약합니다. 백 슬래시 나 줄 바꿈이 포함 된 파일 이름이 있으면 제대로 복사되지 않거나 임의의 파일을 제거하도록 스크립트를 속일 수도 있습니다. 따라서 질문에 코드를 사용하지 마십시오 파일 이름에 백 슬래시 나 줄 바꿈이 포함되지 않도록 신뢰할 수있는 경우가 아니면 .

향후 참조를 mv위해, 큰 크로스 드라이브 이동에는 절대 사용하지 않는 것이 좋습니다 . 정확하게 중단 될 경우 발생하는 상황을 제어하기 어렵 기 때문입니다. rsync를 사용하여 복사 한 다음 원본을 제거하십시오.


rsync가 mv 가하지 않는 약속은 무엇입니까?
무엇

4
글쎄, 예를 들어 rsync당신이하려는 일을하지만 mv그렇지는 않습니다. 또한 : 다른 기계들 사이의 복사; 전달을위한 압축; 타임 스탬프 또는 해시 기반 등식을 기반으로 대상에 존재하는 파일을 건너 뜁니다. 소유권, 권한, 링크 및 특수 파일의 구성 가능한 처리; 등 linux.die.net/man/1/rsync
바보 괴물

1
@SillyFreak은 Gilles가 크로스 드라이브에 대해 말한 것처럼 "mv"대신 항상 rsync를 사용해야하지만 "너무 큰"의 경계가 상대적으로 주관적이며 문제가있는 경우 모든 작업을 수행해야한다고 결론 내립니다. 어쨌든 rsync에 의해 해결되었을 것입니까?
무엇

9
글쎄, 하나의 파티션 내에서 파일이나 디렉토리를 이동할 때, 파일이나 디렉토리에 mv대한 참조 만 이동하기 때문에 일반적으로 파일 관리자를 사용합니다. 실제 데이터 전송을 수행해야하는 rsync경우 다음 중 하나에 해당하면 사용 합니다. 1) 한 번에 올바른 전송을 확인할 수있는 것보다 많은 파일을 이동하고 있습니다. 2) 파일을 동기화 상태로 유지해야합니다. 3) 전송이 중단 될 수 있다고 생각합니다. 내 요점은 질문에 제시하는 유스 케이스에 대해 rsync단순히 올바른 도구 mv이거나 cp그렇지 않다는 것입니다.
Silly Freak

7
항상 rv 명령을 -v 및 —dry-run과 함께 실행하여 수행 할 작업을 정확하게 확인하는 것이 좋습니다.
대런
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.