--include=file 옵션을 사용할 때 RSYNC는 아무것도 복사하지 않습니다.

--include=file 옵션을 사용할 때 RSYNC는 아무것도 복사하지 않습니다.

소스의 일부를 대상에 복사하고 싶습니다.

SRC_DIR=/a/b/c/d/e  
DEST_DIR=/x/y/z/d/e

스크립트가 시작되면 다음 위치에 모든 폴더가 생성됩니다 $DEST_DIR.

mkdir -pv /x/y/z/d/e  

소스의 상대 경로 목록이 있고 이것이 e복사하려는 첫 번째 하위 경로입니다. 목록은 다음과 같이 find 명령의 출력에서 ​​작성됩니다.

/USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root  
....  
....  
/002_DATA/SSH/2023_09_01.prev/root  
....   
....   
....  
/002_DATA/USER_CONFIG_INITIAL/root  
....   
....  
....  
....  
/001_SCRIPTS/000_TOOLS/root  
....   
....  

포함 목록을 작성하려면 먼저 상위 폴더를 배치한 다음 찾기 출력에서 ​​얻은 목록을 배치합니다. 목록은 다음과 같습니다.

/a  
/a/b  
/a/b/c  
/a/b/c/d  
/a/b/c/d/e  
/USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root  
....  
....  
/002_DATA/SSH/2023_09_01.prev/root  
....   

마지막 명령은 다음과 같습니다.

rsync -arzh -vvv --include='/tmp/000_my_include_root_dirlist.txt' --exclude='*' "$SRC_DIR/"  "$DST_DIR/"

U&L Stack Exchange에서 찾은 많은 팁을 시도했지만 성공하지 못했습니다. 내가 뭘 잘못했나요?

음, Chris의 제안은 소규모 폴더 세트에 적용됩니다. 내 문제는 --recursive 옵션이 누락되고 폴더의 고정 비트를 사용하는 데서 발생합니다. 전체 테스트를 해볼 예정입니다. 최대한 빨리 소식을 전하겠습니다.

답변1

옵션에는 내용이 아닌 --include='/tmp/000_my_include_root_dirlist.txt'파일이 포함됩니다 . "$SRC_DIR/tmp/000_my_include_root_dirlist.txt"아마도 당신은 원할 것이고 --files-from--include다 원하지 않을 것 --exclude입니다:

rsync --dry-run -ah -vv --files-from='/tmp/000_my_include_root_dirlist.txt' "$SRC_DIR/"  "$DST_DIR"

이제 파일 목록에서 첫 번째 그룹을 제거 /a하고 나열된 나머지 파일에 한 줄에 하나씩 상대 경로가 있는지 확인하십시오. 예를 들어, 대표합니다./a/b/c/d/e$SRC_DIR/my_file.txt"$SRC_DIR/my_file.txt"

나는 그것이 무엇을 할 것인지 보여주기 위해 --dry-run그것을 추가했습니다 . rsync구현할 준비가 되면 이 옵션을 제거하십시오. 또한 .and -r의 일부였기 때문에 중복된 콘텐츠를 제거했습니다 . 로컬로 복사하면 의미가 없기 때문입니다.-a-z

또한 복사할 파일 목록을 직접 생성할 수 있는데 왜 복사할 파일 목록을 생성하려는 것 같은지 약간 혼란스럽습니다 rsync. ( find파일 세트를 제한하기 위해 다른 기준을 적용했을 수도 있습니다 .)

답변2

말씀하신 대로 , USER_CONFIG_COPY002_DATA001_SCRIPTS 의 하위 디렉터리  인 경우 해당 항목을 앞에  e두어서는 안 됩니다 (예: ). " "는 이  디렉토리 에 있음을 의미합니다.//USER_CONFIG_COPY/USER_CONFIG_COPYUSER_CONFIG_COPY뿌리목차.

cd실행 /a/b/c/d/e하고 실행 하면 find아래와 같은 결과가 나타납니다.

./USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root
./002_DATA/SSH/2023_09_01.prev/root

이것 .처음에 있는 s는 장식용이 아닙니다. 그냥 놔둘 수는 없습니다. 이는 경로가 다음과 관련되어 있음을 나타냅니다.., 현재 디렉토리(즉 /a/b/c/d/e)입니다.

마찬가지로 실행하면 다음과 같은 결과가 나옵니다.find "$SRC_DIR/" criteria

/a/b/c/d/e/USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root
/a/b/c/d/e/002_DATA/SSH/2023_09_01.prev/root

파이프로 가정 sed 's#^'$PATH_INCLUDE_FROM'##'하면 $PATH_INCLUDE_FROM표시 /a/b/c/d/e되는 출력도 얻을 수 있습니다. 이것도 잘못된 것입니다. 인용할 경우 /a/b/c/d/e/USER_CONFIG_COPY/...한 줄에 넣고 다음 줄에 넣는 것은 옳지 않습니다. 각 줄은 유효한 파일 이름이어야 합니다./a/b/c/d/e/USER_CONFIG_COPY/...

그런데,

  • 동일한 디렉터리를 참조하는 두 개의 변수( SRC_DIR및 ) 가 있는 이유는 무엇입니까 ?PATH_INCLUDE_FROM
  • 's#^'$PATH_INCLUDE_FROM'##'문법 오류. 대신 "s#^$PATH_INCLUDE_FROM##"(큰따옴표 포함 )을 사용하세요 ".

관련 정보