首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在创建文件夹结构的同时使用(scp | rsync)拉取特定文件?

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

Stack Overflow用户
提问于 2019-05-22 02:41:29
回答 2查看 443关注 0票数 -1

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

代码语言:javascript
复制
find ./ -type f -name '*_out.csv' ! -path './*/doc/*' 2>/dev/null

这将生成如下列表(为简洁起见,将其截断):

代码语言:javascript
复制
./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将这些文件拉到我的本地计算机上,并创建文件夹结构,其中不包含任何其他内容。最好的方法是什么?我有一大堆文件,所以我并不想事先创建文件夹结构。我也不能从服务器上拉出整个项目,因为它太大了,系统管理员会生我的气。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-22 03:26:14

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

代码语言:javascript
复制
#!/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在服务器上执行)返回您希望复制到本地计算机的文件列表。

这远不如单个rsync调用有效,但如果find命令在远程目录树下生成分支,这些分支在文件名之前具有多级目录,否则不会在本地计算机上创建,则必须在对远程文件调用rsync之前手动确保创建这些路径。

票数 1
EN

Stack Overflow用户

发布于 2019-05-22 03:23:01

我认为你可以通过rsync--exclude--include选项来实现这一点。

代码语言:javascript
复制
rsync --recursive --include '*_out.csv' --exclude '*/doc/*' server:path/to/remote/dir path/to/local/dir
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56244561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档