リモートシステムからローカルシステムにディレクトリ構造を再作成し、各ディレクトリにファイルサンプルをコピーしたい(たとえば、各ディレクトリから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)