使用 (scp | rsync) 在创建文件夹结构的同时提取特定文件?

Using (scp | rsync) to pull specific files while creating folder structure at same time?

我在服务器上托管了一个大项目,该项目包含我想以相同文件夹结构复制到本地计算机的特定文件,但只有我想要的特定文件。我当前查找这些文件的命令是(在服务器上的项目中):

find ./ -type f -name '*_out.csv' ! -path './*/doc/*' 2>/dev/null

生成这样的列表(为简洁起见被截断):

./validation/Riso_AN8/analysis/Riso_AN8_out.csv
./validation/FUMEXII_Regate/analysis/Regate_smeared_out.csv
./validation/FUMEXII_Regate/analysis/Regate_discrete_out.csv
./validation/IFA_432/analysis/rod3/IFA_432_rod3_out.csv
./validation/IFA_432/analysis/rod1/IFA_432_rod1_out.csv
./validation/IFA_432/analysis/rod2/IFA_432_rod2_out.csv
./validation/LOCA_REBEKA_cladding_burst_tests/analysis/rebeka_2d_06MPa/rebeka_singlerod_2d_06MPa_out.csv
./validation/LOCA_REBEKA_cladding_burst_tests/analysis/rebeka_2d_06MPa/rebeka_singlerod_2d_06MPa_tm_out.csv
./validation/LOCA_REBEKA_cladding_burst_tests/analysis/rebeka_2d_08MPa/rebeka_singlerod_2d_08MPa_tm_out.csv

我想使用 scprsync 将这些文件拉到我的本地计算机并创建文件夹结构,其中没有任何其他内容。最好的方法是什么?我有 ton 个文件,所以我真的不想事先创建文件夹结构。我也不能从服务器中提取整个项目,因为它很大,系统管理员会生我的气。

有没有办法在本地计算机上创建文件夹结构的同时提取这些文件?

我认为您可以使用 rsync--exclude--include 选项。

rsync --recursive --include '*_out.csv' --exclude '*/doc/*' server:path/to/remote/dir path/to/local/dir

我会鼓励 rsync 并且我可能会通过 ssh 调用 find 使用 basedir 进程替换中提取文件。然后,您可以输入一个 while 循环来读取在服务器上找到的每个文件名,获取路径并使用 mkdir -p(带验证)在当前目录下的本地计算机上创建路径。然后你可以调用 rsync 使用 rsync -uav 将文件从服务器拉到正确的目录。例如你可以做类似的事情:

#!/bin/bash

server=${1:-yourserver}       ## your server name
basedir=${2:-/path/to/files}  ## the base directory to run find on server

while read -r line; do        ## read line at a time from find output on server
    dname="${line%/*}"        ## separate directory name
    mkdir -p "$dname" || {    ## create/validate directory from remote file
        printf "error: unable to create '%s'.\n", "$dname" >&2
        continue
    }
    rsync -uav "$server:$line" "$dname" ## rsync file to correct directory
done < <(ssh "$server" "find $basedir -type f -name '*_out.csv' ! -path './*/doc/*' 2>/dev/null")

然后只需在本地计算机上调用脚本,提供服务器名称作为第一个参数以及文件在服务器上所在的基本目录。确保将本地计算机上的目录更改为要在其下创建远程目录结构的目录。这假定您的 find 调用(由 ssh 从本地计算机在服务器上执行) returns 您希望复制到本地计算机的文件列表。

这几乎不如单个 rsync 调用有效,但是如果您的 find 命令在远程目录树下产生分支,并且在文件名之前有 multi-levels 个目录否则不会在本地计算机上创建,您必须手动确保在远程文件上调用 rsync 之前创建这些路径。