从远程系统复制目录结构和文件示例

从远程系统复制目录结构和文件示例

我想重新创建从远程系统到本地系统的目录结构,并复制每个目录中的文件样本(例如,仅从每个目录复制 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)

相关内容