![从远程系统复制目录结构和文件示例](https://linux22.com/image/174370/%E4%BB%8E%E8%BF%9C%E7%A8%8B%E7%B3%BB%E7%BB%9F%E5%A4%8D%E5%88%B6%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84%E5%92%8C%E6%96%87%E4%BB%B6%E7%A4%BA%E4%BE%8B.png)
我想重新创建从远程系统到本地系统的目录结构,并复制每个目录中的文件样本(例如,仅从每个目录复制 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)