rsync는 대상 폴더에 동일한 이름의 디렉터리를 생성합니다.

rsync는 대상 폴더에 동일한 이름의 디렉터리를 생성합니다.

11.* 및 14.*(하위 폴더 포함)로 시작하고 1일 이내의 폴더에 있는 .bin 파일만 rsync하려고 합니다.

내가 지금까지 시도한 것 :

rsync -Rarv `find /mnt/IP/ftp/123/ -type f -mtime -1` --prune-empty-dirs --include "1[1][4]./" --include="*.bin" --exclude="*" "/mnt/IP/ftp/123/" "/home/ftp/123/"

일반적으로 작동하지만 Rsync는 대상 내부에 동일한 이름의 디렉토리를 생성합니다: /home/ftp/123/mnt/IP/ftp/123/

그래서 11.* 또는 14.*로 시작하는 폴더만 다시 생성하는 솔루션을 찾고 있습니다.

답변1

이 답변은 "1일 이내" 제한을 고려하지 않습니다.

노력하는 대신출력 구문 분석find, rsync직접 사용~에서 find:

find /mnt/IP/ftp/123 -type -name '1[14].*' -prune \
    -exec rsync -av \
        --include='*.bin' --include='*/' \
        --exclude='*' --prune-empty-dirs {} /home/ftp/123 ';'

11.이름이 in 14.또는 under 로 시작하는 디렉토리를 찾습니다 /mnt/IP/ftp/123. 이러한 각 디렉터리에 대해 검색 목록에서 디렉터리를 제거하고(를 사용하여 -prune) 다음을 실행합니다.

rsync -av --include='*.bin' --include='*/' \
    --exclude='*' --prune-empty-dirs {} /home/ftp/123 

여기서는 {}발견된 디렉터리의 경로 이름으로 대체됩니다.

rsync명령은 /home/ftp/123찾은 디렉터리와 동일한 파일 이름(예: 11.또는 로 시작 14.)을 가진 하위 디렉터리를 생성한 다음 .bin파일을 복사합니다.

사용된 포함 및 제외 패턴 rsync(첫 번째 일치 항목 승리):

  • --include='*.bin': 파일 이름이 .로 끝나는 모든 파일을 포함합니다 .bin.
  • --include='*/': 모든 디렉터리를 포함합니다. 로 인해 대상의 빈 디렉토리가 손실됩니다 --prune-empty-dirs.
  • --exclude='*': 이전 규칙에 포함되지 않은 항목을 제외합니다.

답변2

이를 사용하여 find세 가지 조건을 충족하는 파일 세트를 빌드할 수 있습니다.

  • 하루도 안 돼
  • 11.*일치하는 디렉터리에 있어야 합니다 .14.*
  • 파일 일치*.bin

그런 다음 이 목록이 공급되어 rsync처리됩니다.

find mnt/IP/ftp/123/./ -mtime -1 \( -path '*/1[14].*/*' -prune \) -name '*.bin' -print0 |
    rsync -av --files-from - --from0 --prune-empty-dirs / dst/    

나는 이름에 예상치 못한 문자가 포함된 파일이 올바르게 처리되도록 하기 위해 -print0및 를 사용했습니다 . -from0경로 /./에 있는 추가 항목은 해당 구성 요소 이전의 모든 항목이 대상 경로에서 제거된다는 find의미입니다 . (상대 경로 (예: 로 시작하지 않는 경로 ) rsync를 사용하기로 결정한 경우 소스를 에서 로 변경하세요 . )find/rsync/.


예시 시나리오

# All files in the example
find /mnt/IP/ftp/123/./ -type f
/mnt/IP/ftp/123/./11.one/7.skip/skip.bin
/mnt/IP/ftp/123/./11.one/item.bin
/mnt/IP/ftp/123/./12.skip/item.bin
/mnt/IP/ftp/123/./14.one/item.bin
/mnt/IP/ftp/123/./item.bin
/mnt/IP/ftp/123/./sub/13.skip/item.bin
/mnt/IP/ftp/123/./sub/14.next/item.bin
/mnt/IP/ftp/123/./sub/14.next/skip.this
/mnt/IP/ftp/123/./sub/item.bin

# Files matched by "find"
find mnt/IP/ftp/123/./ -mtime -1 \( -path '*/1[14].*/*' -prune \) -name '*.bin' -print
/mnt/IP/ftp/123/./11.one/item.bin
/mnt/IP/ftp/123/./14.one/item.bin
/mnt/IP/ftp/123/./sub/14.next/item.bin

# Files copied by "rsync"
find /mnt/IP/ftp/123/./ -mtime -1 \( -path '*/1[14].*/*' -prune \) -name '*.bin' -print0 |
    rsync -av --files-from - --from0 --prune-empty-dirs / dst/
building file list ... done
11.one/
11.one/item.bin
14.one/
14.one/item.bin
sub/
sub/14.next/
sub/14.next/item.bin

관련 정보