다음 텍스트 파일이 있습니다
...
/a/b/c/f1
/a/b/c/f2
...
/a/b/c/d1
...
어디에 f1
과 f2
파일은 d1
있지만 디렉토리입니다. 정확한 계층 구조를 대상 폴더( )에 복사하고 싶습니다 /z
.
Bash를 사용하면 lr
텍스트 파일에서 읽은 모든 줄에 대해 내 스크립트가 실행됩니다(단순화를 위해 이러한 옵션은 생략했습니다).
rsync $lr/ /z/$lr
/z/a/b/c/d1
결과를 파일에 대해 .Unfortunately(안타깝게도) 얻으면 폴더가 올바르게 복사됩니다 .
/z/a/b/c/f1/f1
/z/a/b/c/f2/f2
rsync
파일 및 디렉터리에 대해 위와 동일한 호출을 사용하여 이 문제를 어떻게 해결할 수 있습니까?
답변1
파일을 수동으로 재동기화하지 마세요. --files-from=
텍스트 파일을 포함하려면 이 옵션을 사용하십시오 .
디렉토리 규칙:
- 경로가 후행으로 끝나지 않는 경우에만 디렉터리를 생성합니다.
/
- 디렉토리의 내용을 동기화하려면 후행
/
또는 옵션--recursive
/-r
또는를 추가하십시오.
옵션을 사용 -a
하고 재귀를 원할 경우 -r
추가로 추가해야 합니다. 파일의 경로가 소스 디렉토리에 상대적인지 확인하십시오(선두 포함 또는 제외 /
).
입력의 최소 예는 다음과 같습니다.
rsync --files-from=textfile / /z
텍스트 파일을 미리 수정/필터링해야 하는 경우 이를 stdin에서 rsync로 전달할 수 있습니다.
your_command textfile | rsync --files-from=- / /z
답변2
당신의 명령을 보자 rsync
. 옵션을 생략하셨습니다. 이것이 중요합니다. 따라서 -a
( --archive
) 또는 -rt
( ) 를 사용한다고 가정하고 --recursive --times
편의를 위해 -v
( )도 추가하겠습니다 --verbose
.
다음 텍스트 파일에서 소스 파일을 읽고 있습니다.
/a/b/c/f1 /a/b/c/f2 ... /a/b/c/d1
텍스트 파일의 각 줄을 읽는 다음 템플릿이 있습니다 $lr
.
rsync $lr/ /z/$lr
템플릿 명령에 해당 라인 f1
합계를 적용 d1
하고 결과를 살펴보겠습니다.
mkdir -p /tmp/733765
cd /tmp/733765
mkdir -p a/b/c/d1
touch a/b/c/{f1,f2,d1/f3} z
rsync -av a/b/c/f1/ z/a/b/c/f1
rsync -av a/b/c/d1/ z/a/b/c/d1
우리는 우리에게 보여진 정보를 바탕으로 다음과 같은 사실을 즉시 알 수 있습니다.문서 f1
복사되지 않습니다. 대신에 이 오류가 발생합니다.
rsync: [sender] change_dir "/tmp/733765/a/b/c/f1" failed: Not a directory (20)
대상에서 볼 수 있다면 f1
다른 솔루션(아마도 이전 시도)을 사용하여 복사되었을 것입니다 rsync
.
마찬가지로 d1
디렉터리 경로를 이미 생성하지 않은 한 대상에 복사되지 않습니다 z/a/b/c
.
rsync: [Receiver] mkdir "/tmp/733765/z/a/b/c/d1" failed: No such file or directory (2)
mkdir -p z/a/b/c
rsync -av a/b/c/d1/ z/a/b/c/d1
created directory z/a/b/c/d1
./
f3
sent 122 bytes received 71 bytes 128.67 bytes/sec
귀하의 질문에 있는 정보 중 일부가 올바르지 않습니다. 해당 명령을 무시 rsync
하고 소스 데이터세트에 초점을 맞추면 다음을 rsync
사용하여 소스 데이터세트를 직접 읽을 수 있습니다.
rsync --files-from /path/to/source_data_file -arv . z/
-a
일반적으로 include 를 사용하고 있기 때문에 이는 다소 이상하게 보일 수 있습니다 -r
. 그러나 --files-from
소스 데이터 파일에 디렉토리를 사용하고 지정했기 때문에 나열된 소스 디렉토리에 대한 재귀를 -r
알리기 위해 명시적으로 지정 해야 합니다. rsync
(이것이 없으면 이름이 지정된 파일만 복사할 수 있습니다.)