원격 시스템에서 디렉터리 구조 및 파일을 복사하는 예

원격 시스템에서 디렉터리 구조 및 파일을 복사하는 예

원격 시스템에서 로컬 시스템으로 디렉터리 구조를 다시 만들고 각 디렉터리에 파일 샘플을 복사하고 싶습니다(예: 각 디렉터리에서 5개의 파일만 복사). 여러 수준의 중첩된 디렉터리가 있을 수 있으며 각 디렉터리에 많은 파일이 있을 수 있습니다.

내 문제는 비슷하지만 원격 시스템에 소스 디렉터리를 두는 데 어려움이 추가되었습니다. 임의의 수의 파일로 디렉터리 구조 복사

ssh 명령을 추가하여 위 질문에 언급된 솔루션을 수정하려고 시도했지만 여러 파이프를 통해 ssh 명령을 관리하는 것에 대해 혼란스럽고 cpio의 마지막 단계가 원격 시스템에서 복제될 수 있다고 생각하지 않습니다.

find "$src" -type d -links 2 -exec \
    sh -c 'find "$1" -type f -print0 | shuf -z -n "$2"' sh {} "$nfiles" \; | \
    cpio -padmv0  "$dest"

rsync의 필터 규칙이 이를 수행할 수 있는지 조사했지만 파일에 사용할 수 있는 특정 명명 패턴이 없기 때문에 그렇게 할 수 있다고 믿지 않습니다.

이 작업을 수행하는 쉬운 방법이 있으면 알려주십시오.

편집: Perl 또는 Python 스크립트와 관련된 솔루션을 환영합니다. 업무에 가장 적합한 도구가 무엇인지 알려주세요.

답변1

이 문제를 해결하기 위해 Python으로 다음 스크립트를 작성했습니다. 더 빠를 수도 있지만 작동합니다. 피드백을 환영합니다.

from pathlib import Path

from paramiko import SSHClient
from scp import SCPClient

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect('example.com')

scp = SCPClient(ssh.get_transport())
source_dir = '/remote_data'
local_dest_dir = Path('/local_data')
num_files = 10

command = f"find {source_dir} -type d -links 2"
stdin, stdout, stderr = ssh.exec_command(command)
dirs = [Path(d.strip('\n')) for d in stdout.readlines()]
for dir in dirs:
    relative_dir = str(dir).replace(source_dir, '')
    local_dir = Path(local_dest_dir) / Path(relative_dir)
    local_dir.mkdir(exist_ok=True, parents=True)
    command = f"find {source_dir} -type f | shuf -n {num_files}"
    stdin, stdout, stderr = ssh.exec_command(command)
    files = [Path(f.strip('\n')) for f in stdout.readlines()]
    for file in files:
        scp.get(str(file), local_dir / file.name)

관련 정보