폴더(많은 파일과 하위 폴더, 수백 GB)가 있습니다. rsync를 사용하여 폴더를 복사했지만 타임스탬프를 유지하는 것을 잊어버렸습니다.
이제 새 폴더에 많은 새 파일이 추가되고 기존 파일이 수정되었습니다.
이전 폴더의 타임스탬프를 새 폴더에 복사해야 하지만, 2021년 7월 9일 이후에 파일이 수정되지 않은 경우에만 해당됩니다.
나는 rsync가 이것을 할 것이라고 생각하지 않습니다. 사용해야 할 것 같지만 touch -t
모든 파일을 처리하는 효율적인 방법이 필요합니다. 더 좋은 방법이 있나요? 또는 7월 9일 이후 파일이 수정되지 않은 경우 어떻게 모든 파일을 처리하고 타임스탬프를 업데이트합니까?
감사해요.
답변1
다음은 작동해야 하는 한 줄의 코드입니다.
find /path/to/newdir -type f -not -newermt 09jul2021 -printf './%P\000' | rsync -r --files-from=- -0 --size-only --times /path/to/olddir/ /path/to/newdir/
명령의 전반부는 "newdir"
2021년 7월 9일 이후 수정되지 않은 파일의 null로 구분된 목록을 생성하며, 동기화 디렉터리에 대한 상대 경로 형식으로 지정됩니다.
명령의 후반부는 rsync
해당 파일 목록에서 실행되고 수정 타임스탬프를 "newdir"
일치 하도록 변경합니다."olddir"
답변2
가장 안정적인 방법은 rsync 자체를 사용하는 것입니다.
--size-only 플래그를 사용하여 이전 폴더로 다시 복사하면 이전 폴더보다 최신 파일만 복사되므로 기존 파일의 타임스탬프는 영향을 받지 않습니다.
이것은 모든 사람에게 완벽한 대답은 아니지만 --size-only 플래그로 인해 여기에서 작은 변경 사항이 손실될 위험은 나에게는 문제가 되지 않습니다.
먼저 --dry-run으로 실행한 다음 diff를 사용하여 결과를 확인하여 모든 것이 예상대로 작동하는지 확인했습니다.
답변3
GNU find
/ touch
.
cd newdir && find . -depth ! -newermt 2021-07-10 -exec \
touch -hr '../olddir/{}' '{}' \;
(여기서 2021-07-10은 2021-07-10 오전 00:00:00을 의미합니다. 자정 ! -newertmt 2021-07-10T23:59:59.99999999
나노초에 마지막으로 수정된 파일을 제외하려면 다음으로 변경하세요.)
파일당 하나씩 실행 되므로 touch
그다지 효율적이지 않습니다.
애플릿이 fork+exec 없이 다른 애플릿을 호출할 수 busybox
있도록 구성하면 다음을 통해 작업 속도를 높일 수 있습니다.sh
cd newdir && find . -depth ! -newermt 2021-07-10 -exec \
busybox sh -c '
for file do
touch -hr "../olddir/$file" "$file"
done' sh {} +
touch
그러나 타임스탬프의 나노초 부분을 복사하려면 busybox 1.34.0 이상의 애플릿이 필요합니다 .