원격 시스템에서 로컬 시스템으로 디렉터리 구조를 다시 만들고 각 디렉터리에 파일 샘플을 복사하고 싶습니다(예: 각 디렉터리에서 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)