我在服务器上托管了一个大项目,该服务器具有要复制到同一文件夹结构中的本地文件的特定文件,但只有我想要的特定文件。我当前用于查找这些文件的命令是(在服务器上的项目中):
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
我想使用scp
或rsync
将这些文件拉到我的本地计算机上,并创建没有其他任何内容的文件夹结构。最好的方法是什么?我有 ton 个文件,因此我真的不想事先创建文件夹结构。我也不能从服务器上提取整个项目,因为它很大,系统管理员会生我的气。
有没有办法在我的本地计算机上同时创建文件夹结构的同时提取这些文件?
答案 0 :(得分:1)
我认为您可以使用rsync
的{{1}}和--exclude
选项来做到这一点。
--include
答案 1 :(得分:1)
我鼓励rsync
,并且可能会使用find
通过ssh
调用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
在服务器上从本地计算机执行)返回了您要复制到本地计算机的文件列表。
这几乎不像单个rsync
调用那样有效,但是如果您的find
命令在远程目录树下生成分支,并且这些分支在文件名之前具有多级目录,而在其他情况下则不会在本地计算机上创建,您必须手动确保在调用远程文件上的rsync
之前创建了这些路径。