rsync 텍스트 파일의 절대 경로가 포함된 디렉터리 목록

rsync 텍스트 파일의 절대 경로가 포함된 디렉터리 목록

디렉토리 목록과 해당 디렉토리가 포함된 텍스트 파일이 있습니다.절대 경로

$ cat DirectoriesToCopy.txt

/data/Dir1
/data/Dir2

rsync를 사용하여 이러한 모든 디렉터리를 다른 위치로 복사하고 절대 경로를 유지하고 싶습니다.

다음 rsync 명령을 시도했지만 작동하지 않습니다

rsync -avr --include-from=DirectoriesToCopy.txt --exclude='*/' --exclude='/*'  /  /media/MyDestination/

여기서 무슨 문제가 있습니까?

답변1

rsync [목록에서]를 사용하여 이 모든 디렉터리를 복사하고 절대 경로를 다른 위치로 유지하고 싶습니다.

--include또는 --filter변형을 사용하면 상황이 혼란스러울 뿐이므로 사용하지 마세요 . 대신에 --files-from=_filename_.위치시험. )

  1. 한 줄에 하나의 디렉터리/파일씩 파일에 디렉터리 목록을 만듭니다.

  2. --files-from=위 파일과 함께 rsync를 사용하십시오.

  3. 소스 경로 이름이 대상의 끝에 복사되도록 하려면 --relative/ 옵션을 사용하십시오 .-R

  4. -a옵션이 있더라도 -r매뉴얼 페이지에서 포함하십시오.

    두 경우 모두 -r 옵션이 활성화되면 해당 디렉터리의 전체 계층 구조도 전송됩니다(-a는 -r을 의미하지 않으므로 -r은 --files-from을 사용하여 명시적으로 지정해야 한다는 점을 기억하세요).

완전한 명령:

rsync ${DEBUG:+-nv} -arR --files-from=<list_of_files.txt> <top-level-dir>  <target-dir>

(파일 위치파일목록.txt친척이거나 다음에서 발견되어야 합니다.최상위 디렉토리)

(DEBUG가 설정된 경우 rsync는 복사된 내용만 인쇄합니다.)

답변2

다음 명령을 사용하십시오.

rsync -av --include-from=DirectoriesToCopy.txt --include /data/ --exclude='/data/*' --exclude='/*/' / /media/MyDestination/

/data/를 명시적으로 포함해야 하거나 파일 목록에 추가할 수 있습니다. 그런 다음 다른 모든 디렉터리를 제외합니다(포함/제외, 순서 문제).

-r는 에 포함되어 있으므로 사용이 중복됩니다 -a.

편집: 다음을 사용하여 동일한 결과를 얻을 수도 있습니다.

rsync -av --relative /data/Dir1 /data/Dir2 /media/MyDestination/

rsync는 몇 개의 디렉토리를 복사하기 위해 어려운 작업을 수행하도록 강요하지 않으며, 동일한 작업을 수행하는 여러 가지 방법을 제공할 뿐입니다. 경우에 따라 포함/제외 접근 방식이 더 적절할 수 있습니다. 여기서는 다음을 수행합니다. -위의 상대 작업( --relative종료되지 않고 전체 /media/MyDestination/Dir1소스 경로가 대상에 복사된 경우)./media/MyDestination/Dir2--relative

답변3

이것rsync 매뉴얼이 상황에 대해 경고합니다("패턴 규칙 포함/제외" 섹션).

이것은 작동하지 않습니다:

+ /some/path/this-file-will-not-be-found
+ /file-is-included
- *

상위 디렉터리가 "some"규칙에 의해 제외되므로 rsync는 '*'디렉터리의 파일이나 파일에 액세스하지 않기 때문에 실패합니다. 한 가지 해결책은 계층 구조의 모든 디렉터리를 포함하는 단일 규칙을 요구하고(규칙 앞부분에 배치) 해당 옵션을 사용하는 것입니다. 또 다른 해결책은 액세스가 필요한 모든 상위 디렉터리에 대해 특정 포함 규칙을 추가하는 것입니다. 예를 들어, 다음 규칙 세트는 제대로 작동합니다."some""some/path""+ */""- *"--prune-empty-dirs

+ /some/
+ /some/path/
+ /some/path/this-file-is-found
+ /file-also-included
- *

귀하의 경우 가장 쉬운 방법은 포함할 디렉터리 목록을 전처리하여 을 포함할 때마다 /path/to/foo모든 상위 디렉터리(,, /path/to)도 포함하고 원래 디렉터리()의 하위 디렉터리()도 포함하도록 하는 것입니다. 그 이후에는 이전에 나열되지 않은 모든 것을 제외하는 규칙이 있습니다 ( )./path//path/to/foo/****

<DirectoriesToCopy.txt awk '
    {print "+ " $0 "/***"; while (sub(/\/+[^\/]+\/*$/, "/")) print "+ " $0}
    END {print "- *"}
' >rsync-rules.txt
rsync -avr --include-from=rsync-rules.txt  /  /media/MyDestination/

관련 정보