rsync를 사용하여 순환 구성표를 구현하는 방법

rsync를 사용하여 순환 구성표를 구현하는 방법

rsync나는 항상 내 대상 디렉터리에 최신 N개 파일만 유지하는 것을 목표로(즉, 어느 정도 순환 구성표) 이전에 정렬하고 필터링 하고 싶은 원격 파일 디렉터리가 점점 늘어나고 있습니다 . rsync이에 대한 옵션이 없는 것 같아서 아래 설명된 대로 "임의 원격 명령 삽입" 기술을 사용해 왔습니다 .

https://stackoverflow.com/q/950062/787842

나는 대상 호스트에서 cron으로 실행하는 다음 명령을 생각해냈습니다.

rsync -vrzO --delete \
    -e ssh <remote_host>:'$(cd <remote_dir> && ls -t $PWD/* | head -n 25)' \
    <destination_dir>

이것은 처음에는 잘 작동합니다(즉, 대상 디렉터리가 비어 있는 경우). 최신 파일 25개만 복사됩니다. 그러나 문제는 창이 "앞으로 미끄러질" 때(즉, 새 파일이 도착하면 이전 파일을 로컬에서 밀어내야 하는 경우) --delete예상대로 이 옵션이 작동하지 않는다는 것입니다. 내 생각에는 필터링된 원격 파일이 여전히 존재하기 때문에(즉, '$(..)'삽입된 명령에 의해 일시적으로 숨겨졌을 뿐이므로) rsync로컬에서 필터링할 수 있는 방법이 없습니다. 내 이해가 정확하고 더 좋은 방법이 있습니까?

답변1

다음과 같이 명령을 시뮬레이션할 수 있습니다.

rsync -vrzO --delete -e ssh <remote_host>:'<remote_dir>/file1 <remote_dir>/file2' <destination_dir>/ 이것이 대체된 출력입니다 cd <remote_dir> && ls -t $PWD/* | head -n 2.

rsync는 --delete디렉토리와명령 대체파일 목록 제공. 그래서 --delete작동하지 않습니다.

발췌 man rsync:

- 삭제

이는 rsync에게 수신 측에서 불필요한 파일(송신 측에 없는 파일)을 제거하도록 지시합니다.그러나 디렉토리에만 해당 동기화 중입니다. 너 전체 디렉터리를 보내려면 rsync에 요청해야 합니다.디렉토리 내용(예: "dir/*")에 와일드카드를 사용하는 대신(예: "dir" 또는 "dir/") 와일드카드는 셸에 의해 확장되므로 rsync는 요청이 아닌 단일 파일 전송 요청을 받습니다. 파일의 상위 디렉토리에 대해.

답변2

원격 디렉토리를 다음에 마운트하십시오.sshfs. 그런 다음 이를 로컬 디렉터리로 처리할 수 있습니다.

이제 수정 시간별로 파일을 정렬하는 가장 쉬운 방법은 다음과 같습니다.다루기 힘든~의글로벌 예선. 디렉토리에 있는 가장 최근 25개 파일은 다음과 같습니다.

*(NDom[1,25])

따라서 먼저 복사하려면 대상에서 관련 없는 파일을 삭제하세요.

for x in source/*(NDom[1,25]); do
  y=destination/${x:t}
  if [[ ! -e $y || $x -nt $y ]]; then cp -p $x $y; fi
done
destination_files=(destination/*(NDom[1,25]))
if [[ ${#destination_files} -gt 25 ]]; then
  shift $((${#destination_files} - 25)) destination_files
  rm $destination_files
fi

이는 파일을 복사하기 전에 삭제하는 또 다른 방법입니다. 새 파일을 복사해야 하고 대상에 이미 완전한 파일이 있는 경우 이 파일은 가장 오래된 파일을 삭제합니다.

destination_files=(destination/*(ND)); destination_count=$#destination_files
for x in source/*(NDom[1,25]); do
  y=destination/${x:t}
  if [[ $destination_count -gt 25 && ! -e $y ]]; then rm destination/*(NDom[-1]); fi
  if [[ ! -e $y || $x -nt $y ]]; then cp -p $x $y; fi
done

(경고: 위 코드는 브라우저에 직접 입력한 것이므로 테스트하지는 않았습니다.)

관련 정보