원격 서버에 다음 파일 중 일부가 나열된 비슷한 디렉터리 구조가 있습니다.
/logs/service::A1/20210730T120000/log.log
/logs/service::A1/20210729T120000/log.log
/logs/service::A2/20210730T120000/log.log
/logs/service::B0/20210730T120000/log.log
serviceA의 모든 파일에 액세스하려면 rsync
단일 와일드카드를 사용하여 다음 명령을 실행하면 됩니다.*
rsync -av <remote-server>:/logs/service::A* <destination>
이는 예상대로 작동하며 대상에서 다음 디렉터리 구조를 얻습니다.
<destination>/service::A1/20210730T120000/log.log
<destination>/service::A1/20210729T120000/log.log
<destination>/service::A2/20210730T120000/log.log
rsync
하지만 serviceA의 모든 파일을 원한다면특정일부터 시작해서, 다음과 같은 두 번째 와일드카드가 필요합니다.
rsync -arv <remote-server>:/logs/service::A*/20210730* <destination>
그러나 이렇게 하면 최상위 디렉터리가 손실되고 대상에 다음 구조가 제공됩니다.
<destination>/20210730T120000/log.log
<destination>/20210730T120000/log.log
나는 여전히 service::<xx>
목적지 수준을 원합니다. 이를 달성하는 방법은 플래그를 사용하는 것 같습니다 --include/--exclude
.
그러나 나는 다음을 시도했습니다.여기하지만 파일을 찾을 수 없습니다.
rsync -av --include='service::A**/20210730**' --exclude='*' <remote-server>:/logs/ <destination>
receiving incremental file list
./
답변1
/service::A*/20210730*/**
*/
포함 패턴과 제외 패턴의 조합을 사용하고 싶을 가능성이 높습니다 *
. 실제 전송된 파일을 보관하는 데 필요한 디렉터리 구조만 생성하기 위해 -m
( ) 를 포함할 수도 있습니다 .--prune-empty-dirs
rsync -avm \
--include='/service::A*/20210730*/**' \
--include='*/' \
--exclude='*' \
remote:/logs/ local-path/logs
전송의 파일 나열 단계 동안 모든 디렉터리( 포함 패턴으로 인해)와 첫 번째 패턴과 일치하는 모든 파일 및 디렉터리를 /logs
포함하여 원격 호스트에 루트가 있는 전체 계층 구조를 순회 하지만 다른 것은 제외합니다. */
그런 다음 디렉터리 및 파일의 경로 이름 목록은 전송이 실제로 시작되기 전에 빈 디렉터리("빈"은 "어떤 포함 패턴과 일치하는 파일도 포함하지 않음"을 의미함)로 제거됩니다.
*/
rsync
일치하는 디렉터리 등의 입력을 허용하려면 패턴이 필요합니다. /service::A*
그렇지 않으면 제외 패턴으로 인해 이것이 불가능하기 때문입니다 *
.
위의 솔루션에는 아래의 모든 항목을 완전히 탐색해야 하므로 /logs
파일 계층 구조가 큰 경우 속도가 느려질 수 있습니다.
그렇다면 포함 모드에서 더 선택적으로 작업 속도를 높일 수 있습니다.
rsync -avm \
--include='/service::A*/' \
--include='/service::A*/20210730*/***' \
--exclude='*' \
remote:/logs/ local-path/logs
이는 rsync
일치하는 디렉터리를 입력할 수 있도록 명시적으로 허용합니다 /service::A*/
. 그런 다음 다른 모든 것을 제외하고 관심 있는 모든 타임스탬프 디렉터리를 포함합니다.
비슷한 패턴은 디렉터리 자체 도 포함한다는 점에서 전자와 dir/***
다릅니다 .dir/**
dir