rsync 최신 NGB 파일만

rsync 최신 NGB 파일만

N gb의 데이터를 포함하는 dirA와 dirA의 최신 M gb 데이터만 포함하는 dirB라는 두 개의 디렉토리가 있습니다. dirA에 파일이 추가되면 dirB에도 추가되어야 하며, dirB에서 가장 오래된 파일은 삭제되어야 합니다.

rsync로 가능합니까? 아니면 다른 소프트웨어?

답변1

여기에 시도가 있습니다. 주의 사항: 다음 코드는 광범위하게 테스트하지 않았습니다.

dirA=/path/to/dirA
dirB=/other/path/to/dirB

tmpdir=/path/to/tmpdir

cd "$dirA"
find . -type f -printf '%T@ %s %p\0' | sort -nr -z \
awk 'BEGIN {RS="\000"; ORS="\000"; maxsize=2147483648} 
{size += $2; if (size > maxsize) exit; print $3}' | \
rsync -Rpt --link-dest="$PWD" --files-from=- -0 . "$tmpdir" && \
rsync -rpt --delete "$tmpdir" "$dirB"

몇 가지 설명:

  • find, sort및 부분 의 목적 awk은 기계가 구문 분석할 수 있는(즉, null로 구분된) 최신 파일 목록을 가져와 최신 파일부터 정렬한 다음 누적 크기가 2GiB에 도달하면 해당 목록을 자르는 것입니다(2147483648은 단순히 2*입니다). 2^30바이트 또는 2GiB입니다. 이 숫자를 원하는 대로 조정하세요.
    메모:그만큼미만부분 에서의 비교 awk는 크기가 엄격한 상한선임을 의미합니다("많으면" 조건)이므로 다음과 같은 상황이 발생할 수 있습니다. 최신 파일이 4GiB인 경우 동기화에 아무것도 포함되지 않습니다. 반대 동작을 얻으려면 print $3을의 시작 부분으로 이동하세요("{ }적어도"), 이 경우 4GiB 파일을 얻고 의도한 것보다 두 배나 많이 동기화하게 됩니다. 저는 첫 번째가 더 바람직하다고 생각했습니다.
  • 첫 번째는 rsync해당 파일을 임시 위치( "$tmpdir")에 추출하지만 경로( -R일명 --relative)를 유지합니다. --link-dest전체 복사본이 아닌 하드 링크( 사용)를 사용하므로 이 단계는 무시할 수 있는 공간을 사용하지만 $tmpdir와 동일한 파일 시스템에 있어야 합니다 $dirA.
  • 두 번째 호출은 에서 찾을 수 없는 이전 파일과의 rsync실제 동기화 $dirB및 -ing을 수행합니다 . 임시 디렉토리를 사용하여 이를 두 단계로 수행하는 이유는 삭제 부분을 한 단계로 작동하게 하는 방법을 아직 찾지 못했기 때문입니다.--delete$dirB$tmpdir

관련 정보