scp или rsync несколько файлов с исходного сервера на другие серверы

Так как my nfs является сервером типа win, он не может содержать :. Я хочу скопировать несколько файлов с исходного сервера в каталог 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.By способ, которым кажется rsync, может также выполнить эту часть, которая является более быстрой или предпочтительной.

1
задан 4 June 2019 в 10:28

1 ответ

Ваши целевые файлы находятся в другой системе. Следовательно, ваш глобус (node1:~/experiment/wrfout_d01_2012-12-01*) никогда не расширяется. Вы можете увидеть это прямо в выводе, который вы опубликовали. Первая строка выводится из echo $fn и печатает это:

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

Вы никогда не повторяете файл, соответствующий этому глобу, вы только обрабатываете сам глобус как строку. Поэтому вместо того, чтобы пытаться перечислить файлы, к которым у вас еще нет доступа (вам нужно открыть соединение 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
0
ответ дан 4 June 2019 в 10:28

Другие вопросы по тегам:

Похожие вопросы: