지정된 디렉터리에 지정된 rsync 제외 패턴을 적용합니다.

지정된 디렉터리에 지정된 rsync 제외 패턴을 적용합니다.

다음을 사용하여 rsync일부를 미러링하는 설정이 있습니다.원천(원격) 디렉토리목적지rsync 제외 패턴이 정의된 일부 파일 및 위치 외에도 다음이 포함됩니다.

# Useless files
- thumbs.db
- *.~
- *.tmp
- /*/.cache
- /*/.local/share/trash
# Already rsynced somewhere
- .dropbox
# Medias files
- *.avi
- *.mkv
- *.wav
- *.mp3
- *.bmp
- *.jpg
# System files
- /hiberfil.sys
- /pagefile.sys

스크립트는 Windows 및 Linux 워크스테이션에서 실행되며 --delete매개변수를 사용하여대상 디렉토리에서 관련 없는 파일 제거.

문제는 제외 패턴을 "업데이트"할 때(예: Ogg 파일에 대한 제외 패턴 추가 *.ogg:) 대상에서 기존 Ogg 파일을 제거하려면 rsync를 다시 실행해야 한다는 것입니다.

대상 디렉토리를 정리하기 위해 소스에서 rsync를 다시 실행할 필요가 없도록 특정 디렉토리에 제외 규칙(일부 규칙은 와일드카드를 사용하기 때문에 복잡할 수 있음)을 쉽게 적용할 수 있는지 궁금합니다.

지금까지 기본 이름 일치를 사용하여 파일과 디렉터리를 삭제하려면 다음을 알아냈습니다.

dirToClean="/var/somedir"
excludeFile="file_to_exclude"

# Delete files and dir of $dirToClean whose basename matches an exclude pattern from $excludeFile
for fileToDelete in $(grep --extended-regexp "^- .*" $excludeFile | sed 's/^- \(.*\)$/\1/'); do
    find "$dirToClean" -iname "$fileToDelete" -exec rm {} \;
done

소스 및 대상과 동일한 디렉터리를 사용하여 rsync를 실행할 수 있을까요?

답변1

이렇게 하지 마십시오. rsync를 사용하지 않고 rsync의 포함/제외 패턴 기능을 복제하려는 것은 매우 나쁜 생각입니다. 실제로 일부 패턴은 복잡할 수 있으므로 시도하지 않는 것이 더 좋습니다. rsync 자체를 사용하여 일관된 동작을 보장하고 놀라움을 최소화하세요.

rsync 매뉴얼 페이지에서:

--존재, --존재하지 않으면 무시

          This  tells rsync to skip creating files (including directories)
          that do not exist yet on the destination.   If  this  option  is
          combined  with  the  --ignore-existing  option, no files will be
          updated (which can be useful if all you want to do is to  delete
          extraneous files).

따라서 --delete --delete-excluded --ignore-existing --ignore-non-existing을 사용하여 실행해야 하며 rsync는 불필요한 파일을 삭제하고 다른 파일을 업데이트하거나 삭제하지 않습니다.

답변2

코딩 대신 작업을 수행하기 위해 사용 가능한 rsync 옵션을 사용하라는 Kyle Jones의 제안에 따라 다음을 발견했습니다.

rsync --include-from=file_to_exclude --recursive \
--delete-excluded \
/var/somedir/ /var/somedir/

훌륭하게 작동합니다. 또한 여러 시나리오에서 사용해 보았지만 --ignore-existing --ignore-non-existing --delete결과는 이 3가지 옵션이 없는 것과 동일합니다.

관련 정보