Rsync : 타임 스탬프 만 복사


42

현재 타임 스탬프를 제외하고 모든면에서 동일한 두 개의 디렉토리 A / B가 있습니다. 따라서 내가 명령을 실행하면 :

rsync --dry-run -crvv A/ B/

그런 다음 모든 파일은 "최신"으로 표시되지만 명령은 다음과 같습니다.

rsync --dry-run -rvv A/ B/

모든 파일이 A /에서 B /로 복사됨을 나타냅니다.

내 질문은 이것입니다 : 파일이 내용과 관련하여 동일하다는 것을 알고 있다면 (rsync 또는 다른 방법으로) B의 파일에 대한 타임 스탬프를 파일의 타임 스탬프와 동일하게 설정하는 방법이 있습니까? A /에서 B /로 모든 파일을 복사하지 않고 A /?

감사


파일이 동일하다는 것을 알고 있다면 필요한 날짜 / 시간 스탬프를 얻기 위해 파일을 복사하지 않는 이유는 무엇입니까?
Tim

3
@Tim : 많은 데이터가있을 수 있습니다.
Richard

답변:


75

-t(타임 스탬프 유지)를 사용하면 --size-only크기가 큰 파일 만 비교합니다. 크기가 일치하면 rsync는 파일을 복사하지 않지만 -t지정된 이후 에 파일을 다시 복사하지 않고 대상 파일의 타임 스탬프를 업데이트합니다.

-u이미 존재하는 파일을 건너 뛰고 타임 스탬프 업데이트를 완전히 건너 뛰므로 (업데이트)를 사용하지 마십시오 .

원래 rsync를 사용하여 많은 파일을 새 드라이브에 복사하지 않아서 타임 스탬프가 현재 시간으로 업데이트되는 문제가있었습니다. 적절한 시간 내에 모든 것을 올바르게 동기화하기 위해 아래 명령을 사용했습니다.

rsync -vrt --size-only /src /dest

2
또한 --existing실수로 새 파일을 복사하지 않도록 추가 하는 것이 좋습니다 .
leden

1
깃발 --archive(또는 -a)은 다음을 포함합니다 -r. -t:
Dor

6

--size-only를 사용하면 크기가 일치하는 경우 rsync가 파일 타임 스탬프 (및 파일 내용) 비교를 건너 뜁니다. 이것을 --times와 결합하면 타임 스탬프를 대상 트리에 복제합니다.


3

rsync가 이것을 만드는 올바른 도구라고 생각하지만 스크립트를 원한다면 이것을 시작하는 것이 좋습니다.

다음과 같이 타임 스탬프 (액세스 시간)가있는 파일 목록을 얻을 수 있습니다.

find . -printf '"%p" %a\n' -type f > /tmp/times

그리고 적절한 시간 업데이트 명령을 얻으십시오.

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

완전한 스크립트는 아니지만 시작점이 좋습니다! :)


감사. 나는 아마도 지금 Rsync를 고수 할 것이라고 생각하지만, 앞으로 웹에 가서 스크립트의 다른 구성 요소를 배우게 될 것입니다. 미래에 유용 할 수 있습니다.
artella

그건 내 솔루션 인 것 같았습니다! 메타 데이터를 음악 라이브러리에 추가하는 동안 시간을 ​​보존하고 싶습니다. 그러나 분명히 파일 이름에서 공백을 처리 할 수는 없습니다.
Burcardo

2

touch 명령에 대한 참조로 소스 (예 :) /path/to/source디렉토리를 사용하십시오 . 그냥 cd당신에 대한 대상 디렉토리와 할 일

find -type f -exec touch -r /path/to/source/{} {} \;

rsync (yet)로 초 미만의 타임 스탬프를 복사 할 수 없습니다.

이것은 디렉토리와 의사 파일에서도 작동합니다 (을 제거하거나 변경하십시오 -type f)


한 번 복사해야 할 때 유용했습니다. 나는 그것이 ctime을 복사하지 않는 것을 알았습니다. 제 경우에는 괜찮 았습니다.
snapfractalpop

'touch'맨 페이지를 읽으십시오. 이 명령으로 atime과 mtime을 모두 설정할 수 있습니다.
knorke

예, 사용할 수는 touch -ar있지만 여전히 ctime을 변경하지는 않습니다. 나는 그것이 거의 바람직하지 않다고 생각합니다.
snapfractalpop

아, 지금 문제가 보입니다. 감사. 예, ctime은 변경하기 어렵고 이유를 모르겠습니다.
knorke

1

글쎄, 당신은 확실히 한 쪽에서 타임 스탬프를 읽은 다음 touch를 사용하여 다른 쪽의 동일한 파일에 설정하는 스크립트를 작성할 수 있습니다.

그러나 rsync가 모든 파일을 복사하려고 시도하는 것보다 훨씬 오래 걸릴 수 있습니다. 실제로 데이터가 거의 전송되지 않습니다 (파일이 실제로 동일한 경우 블록 해시 만). 그러나 모든 파일의 전체 내용은 최소한 양쪽에서 읽어야합니다. 따라서 디스크 대역폭이나 IOPS에 의해 시간이 오래 걸릴 수 있습니다. 그러나 여전히 스크립트를 작성하고 테스트하는 것보다 시간이 덜 걸릴 것입니다.


고맙게도 rsync 의이 기능을 알지 못했습니다 (wikipedia에서도 논의 됨).
artella

0

파일수정하고 원래 타임 스탬프를 유지 하려는 나와 같은 사람들 (예 : 음악 라이브러리의 메타 태그를 업데이트)

Stone에서 제공하는 솔루션을 기반으로합니다. 그러나 여기 수정 시간과 타임 스탬프를 복원하는 작업 스크립트에 대해 설명합니다. 먼저 1 단계를 수행 한 다음 파일 작업을 시작하십시오.

  1. 오래된 타임 스탬프를 유지하십시오 . 현재 디렉토리에서 작동하고 모든 숨겨진 파일을 제외하고에 임시 파일로 저장합니다 /tmp/files. 항상 매개 변수를 변경할 수 있지만 -printf '"%t" "%p"\n'이후 touch명령이이를 사용 하므로 계속 유지하는 것이 좋습니다 .

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. 원하는 만큼 파일 수정

  3. 이제 타임 스탬프를 복원하는 데 도움이되는 파일을 만듭니다.

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. 마지막으로 수정 된 파일에 이전 날짜를 적용하십시오.

    sh job.sh

주의 사항 : 이름 간격이있는 파일, 특수 문자가 있지만 예를 들어 $기호가있는 파일은 작동하지 않습니다 .


파일 이름에서 백 슬래시와 관련된 (일부) 문제를 피하려면을 사용하십시오 read -r line. 음, 항상 사용 read으로 -r. 또한 job.sh각 파일을 열지 않아도됩니다. 명령의 끝에 리디렉션을 넣으십시오.while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
hagello

두 번째 경고 :이 스크립트는 디렉토리의 타임 스탬프를 전송하지 않습니다. (잘, OP는 그것을 요구하지 않았다.)
hagello

0

Windows에서 타임 스탬프 만 복사하는 가장 좋은 방법 :

파일의 마지막 생성 / 수정 / 액세스 타임 스탬프를 다른 파일로 복사하려면 다음을 사용하십시오.

/ c / m / a / r를 터치합니다. SourceFile DestFile

(이 버전의 Touch는 Win32 Console ToolBox http://www.stevemiller.net/apps/의 일부입니다 )

Robocopy "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY"/ E / COPYALL / DCOPY : DAT / XF 입니다. / R : 10 / W : 5 / V / ETA


-1

rsync 매뉴얼 : man rsynca -t-N스위치를 나열합니다 .


나는 볼 수 없었다 -N. 어쨌든 이것을 추천합니까?
Tom Hale
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.