“변경된 경우 복사”작업을 수행하려면 어떻게해야합니까? 변경되어 변경되지 않은 디렉토리는 수정하지

디렉토리 A의 파일이 디렉토리 B의 파일과 동일하면 해당 파일을 복사해서는 안된다는 점에주의를 기울여 디렉토리 A에서 디렉토리 B로 파일 세트를 복사하고 싶습니다. 업데이트). 내 자신의 스크립트를 작성하지 않고 기존 도구로 그렇게 할 수있는 방법이 있습니까?

유스 케이스를 조금 더 정교하게하기 위해 : 나는 .c임시 디렉토리에 많은 파일을 자동 생성하고 있다 (무조건 모든 파일을 무조건 생성 해야하는 방법으로). 그리고 파일을 다시 생성 할 때만 복사하고 싶다. 실제 소스 디렉토리로 변경되어 변경되지 않은 디렉토리는 수정하지 않고 (이전 생성 시간과 함께) make다시 컴파일 할 필요가 없음을 알 수 있습니다. (생성 된 모든 파일이 .c파일 인 것은 아니므로 텍스트 비교보다는 이진 비교를 수행해야합니다.)

(참고로이 내가 있슴 질문 밖으로 성장 https://stackoverflow.com/questions/8981552/speeding-up-file-comparions-with-cmp-on-cygwin/8981762#8981762 내가하려고했던 곳, 이 작업을 수행하는 데 사용했던 스크립트 파일의 속도를 높이기 위해, 나 자신에게 직접 스크립트를 작성하는 것보다 더 좋은 방법이 있는지 묻습니다. 특히 쉘 에서이 작업을 수행하는 간단한 방법 때문에 스크립트는 cmp모든 파일 쌍에서 와 같은 것을 호출 하며 모든 프로세스를 시작하는 데 너무 오래 걸립니다.)



답변

rsync가 아마도 가장 좋은 도구 일 것입니다. 이 명령에는 많은 옵션이 있으므로 man page를 읽으십시오 . –checksum 옵션이나 –ignore-times를 원한다고 생각합니다


답변

-u스위치를 사용하여 다음 cp과 같이 할 수 있습니다 .

$ cp -u [source] [destination]

매뉴얼 페이지에서 :

   -u, --update
       copy only when the SOURCE file is newer than the destination file or
       when the destination file is missing


답변

사용 rsync --checksum하는 것이 “변경된 경우 복사”하는 좋은 일반적인 방법 이지만 특정 경우에는 더 나은 해결책이 있습니다!

불필요하게 파일을 다시 컴파일하지 않으려면 정확하게이 목적으로 빌드 된 ccache 를 사용해야합니다 ! 실제로, 자동 생성 된 파일의 불필요한 재 컴파일을 피할뿐만 아니라 make clean처음부터 다시 컴파일 할 때마다 속도가 향상됩니다 .

다음으로 “안전합니까?”라고 물을 것입니다. 네, 웹 사이트가 지적한대로 :

안전 해요?

예. 컴파일러 캐시의 가장 중요한 측면은 항상 실제 컴파일러와 동일한 결과를 생성하는 것입니다. 여기에는 실제 컴파일러를 사용할 경우 생성되는 것과 동일한 객체 파일과 정확히 동일한 컴파일러 경고가 포함됩니다. ccache를 사용하고 있다고 말할 수있는 유일한 방법은 속도입니다.

그리고 makefile 줄에 접두사로 추가하면 쉽게 사용할CC= 수 있습니다 (또는 심볼릭 링크를 사용할 수는 있지만 makefile 방식이 더 좋습니다).


답변

이것은 필요한 것을해야합니다.

diff -qr ./x ./y | awk '{print $2}' | xargs -n1 -J% cp % ./y/

어디에:

  • x는 업데이트 / 새 폴더입니다
  • y는 복사 할 대상입니다
  • awk는 diff 명령에서 각 줄의 두 번째 인수를 취합니다 (공간이있는 파일 이름에는 추가 항목이 필요할 수 있습니다-지금 시도 할 수 없습니다)
  • xargs -J %는 파일 이름을 적절한 위치에 cp에 삽입합니다

답변

내가 사용하고자 한마음 찬성 rsync, 그것은 여러 마스터를 지원하기 때문에 VPN을 별도로 이미 설치 내 SSH 키을 갖는.

따라서 하나의 호스트로 구성된 crontab에서는 15 분마다 동기화되도록했습니다.

* / 15 * * * * [-z “$ (pidof unison)” “& & (시간 종료 25m unison -sortbysize -ui text -batch -times / home / master ssh : //192.168.1.12//home/master -path dev -logfile /tmp/sync.master.dev.log) &> /tmp/sync.master.dev.log

그런 다음 양쪽에서 개발할 수 있으며 변경 사항이 전파됩니다. 실제로 중요한 프로젝트의 경우 동일한 트리를 미러링하는 서버를 최대 4 대까지 보유하고 있습니다 (3 대는 cron에서 동시에 실행되고 그렇지 않은 서버를 가리킴). 실제로 Linux와 Cygwin 호스트는 혼합되어 있습니다. 단, cygwin 환경 외부의 win32에있는 소프트 링크에서는 의미가 없습니다.

이 경로를 이동하는 경우가없는 빈 쪽의 초기 거울을 -batch, 즉,

unison -ui text  -times /home/master ssh://192.168.1.12//home/master -path dev

물론 백업 파일, 아카이브 등을 무시하는 구성이 있습니다.

 ~/.unison/default.prf :
# Unison preferences file
ignore = Name {,.}*{.sh~}
ignore = Name {,.}*{.rb~}
ignore = Name {,.}*{.bak}
ignore = Name {,.}*{.tmp}
ignore = Name {,.}*{.txt~}
ignore = Name {,.}*{.pl~}
ignore = Name {.unison.}*
ignore = Name {,.}*{.zip}

    # Use this command for displaying diffs
    diff = diff -y -W 79 --suppress-common-lines

    ignore = Name *~
    ignore = Name .*~
    ignore = Path */pilot/backup/Archive_*
    ignore = Name *.o


답변

하지만 rsync --checksum정답이 옵션과 호환되지 않습니다이다 --times, 그것은 --archive포함 --times당신이 할 그렇다면 rsync -a --checksum, 당신이 정말로 필요 rsync -a --no-times --checksum.


답변