디렉토리 목록과 해당 디렉토리가 포함된 텍스트 파일이 있습니다.절대 경로
$ 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_
.위치시험. )
한 줄에 하나의 디렉터리/파일씩 파일에 디렉터리 목록을 만듭니다.
--files-from=
위 파일과 함께 rsync를 사용하십시오.소스 경로 이름이 대상의 끝에 복사되도록 하려면
--relative
/ 옵션을 사용하십시오 .-R
-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/