将多个文件从源服务器 scp 或 rsync 到另一台服务器

将多个文件从源服务器 scp 或 rsync 到另一台服务器

由于我的nfswin服务器类型,所以它不能包含:。我想将多个文件从源服务器复制到nfs另一台服务器上的目录并同时重命名它们。

脚本如下:

#!/bin/bash

in_files="node1:~/experiment/wrfout_d01_2012-12-01*"
###########################################################
# the files look like wrfout_d01_2012-12-01_00:00:00
# wrfout_d01_2012-12-01_06:00:00
# wrfout_d01_2012-12-01_12:00:00
# wrfout_d01_2012-12-01_18:00:00
###################################
for fn in $in_files;do
  echo $fn
  newfn=$(basename "$fn")
  echo 'apply basename :'
  echo $newfn
  scp -r "$fn"  "./${newfn//:/_}"
  echo 'next:'
done

运行此脚本后,它会报告

node1:~/experiment/wrfout_d01_2012-12-01*
apply basename :
wrfout_d01_2012-12-01_12_00_00
./wrfout_d01_2012-12-01*: File name too long
./wrfout_d01_2012-12-01*: File name too long
./wrfout_d01_2012-12-01*: File name too long
./wrfout_d01_2012-12-01*: File name too long
next:

但似乎如果我只将脚本应用于一个文件,那就没问题了(即将其更改in_files为某个文件),例如:

node1:~/experiment/wrfout_d01_2012-12-01_00:00:00
apply basename :
wrfout_d01_2012-12-01_00:00:00
wrfout_d01_2012-12-01_00:00:00        100%   71MB  70.5MB/s   00:00    
next:

1.那么我该如何让它适用于多个文件呢?

2.顺便说一下,好像rsync也可以做这部分,哪一个更快或更可取。

答案1

您的目标文件位于另一个系统上。因此,您的 glob( node1:~/experiment/wrfout_d01_2012-12-01*) 永远不会被扩展。您可以在您发布的输出中看到这一点。第一行输出来自echo $fn并打印以下内容:

node1:~/experiment/wrfout_d01_2012-12-01*

您不会迭代与该 glob 匹配的每个文件,而只是将 glob 本身作为字符串处理。因此,您无需尝试列出您尚无权访问的文件(您需要打开 ssh 连接才能查看文件列表),只需将所有内容带过来并在本地重命名即可:

#!/bin/bash

rsync -v node1:"~/experiment/wrfout_d01_2012-12-01*" .
rename 's/:/_/g' wrfout_d01_2012-12-01*

或者,假设你的文件名不包含换行符, 你可以这样做:

#!/bin/bash

in_files=($(ssh node1 'ls ~/experiment/wrfout_d01_2012-12-01*') )
for fn in "${in_files[@]}";do
  newfn=$(basename "$fn")
  rsync node1:"$fn"  "${newfn//:/_}"
done

相关内容