2009-08-13 2 views
6

두 개의 디렉토리를 생각해 보자 :개별 파일을 스캔하지 않고 동기화할까요?

 
/home/user/music/flac 
/media/MUSIC/flac 

첫 번째 디렉토리 (마스터)와 같은 파일과 구조를 포함하는 두 번째 디렉토리 (대상; USB 드라이브)를 원한다. 3600+ 파일 (총 59G)이 있습니다. 모든 파일은 unison을 사용하여 스캔됩니다. 파일 이름, 크기 및 수정 시간을 기준으로 비교하는 것이 좋습니다.

rsync이 더 좋을 수도 있지만 설명서 페이지의 예는 다소 비밀스럽고 Google 검색은 간단하고 통찰력있는 예제를 공개하지 않았습니다. 오히려 실수로 마스터의 파일을 지우지 않을 것입니다. ;-)

마스터 목록은 디렉토리 재구성, 새 파일 추가 및 기존 파일 업데이트 (예 : 재 태그 지정)와 같이 변경됩니다. 보통 변경 사항은 사소합니다. 동기화를 완료하는 데 몇 시간이 걸리 자마자 나에게 적합하지 않습니다.

대상 디렉토리를 마스터와 동기화하는 정확한 명령은 무엇입니까?

명령은 새 파일을 복사하고 이동 된 파일을 재구성 (또는 삭제 후 복사)하고 변경된 파일을 복사해야합니다 (날짜 기준). 대상 파일의 타임 스탬프는 마스터의 타임 스탬프로 설정해야합니다.

답변

6

당신은 rsync를이 방법을 사용할 수 있습니다.

더 많은 옵션이 있지만이 방법으로 충분하다고 생각합니다. :-)

(! 난 그냥 간단한 테스트를했다 더 나은 테스트하십시오!)

+1

'rsync'는 네트워크에서 이러한 종류의 동기화를 가속화하도록 설계되었으므로 모든 59G를 전송할 필요가 없습니다. 송신자와 수신자가 각각의 트리에서 모든 것을 읽어야하기 때문에 로컬 시스템에서 속도가 향상되지 않습니다. – caf

0

을 당신은 (한 당신의 파일 시스템이 작동 타임 스탬프를 가지고있는) & 새가 변경된 파일 복사 평범한 구식 cp를 사용할 수 있습니다

cp -dpRuv /home/user/music/flac /media/MUSIC/ 

소스에없는 파일을 삭제하려면 find를 사용해야합니다. 과 같이 스크립트 /home/user/bin/remover.sh 만들기 :

#!/bin/bash 

CANONNAME="$PWD/$(basename $1)" 
RELPATH=$(echo "$CANONNAME" | sed -e "[email protected]/media/MUSIC/flac/@@") 
SOURCENAME="/home/user/music/flac/$RELPATH" 

if [ ! -f "$SOURCENAME" ]; then 
     echo "Removing $CANONNAME" 
     rm "$CANONNAME" 
fi 

그것을 실행 확인한 다음 find에서 실행 :이하지 않습니다

find /media/MUSIC/flac -type f -execdir /home/user/bin/remover.sh "{}" \; 

유일한 것은에서 제거 된 대상에서 디렉토리를 제거하다 원본 - 원하는 경우 비슷한 찾기/스크립트 조합으로 세 번째 패스를 만들어야합니다.

+0

이것은 나를 위해 bash에서 작동하지 않습니다 - 나는 p (파일 속성 유지), R (재귀) 및 v (자세한) cp에 대한 bash 맨 페이지에서 볼 수 있지만 d 및 u는 아닙니다. – sage

관련 문제