소스의 일부를 대상에 복사하고 싶습니다.
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_COPY
및 002_DATA
가 001_SCRIPTS
의 하위 디렉터리 인 경우 해당 항목을 앞에 e
두어서는 안 됩니다 (예: ). " "는 이 디렉토리 에 있음을 의미합니다./
/USER_CONFIG_COPY
/USER_CONFIG_COPY
USER_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##"
(큰따옴표 포함 )을 사용하세요"
.