Linux 在shell脚本中将文件从两台机器移动到四台机器
我正在做一个项目,我需要将文件从一台机器移动到另一台机器。所有的机器都是Ubuntu机器,它运行的是Ubuntu 12.04。所以我想,我可以直接scp文件 下面是我的文本文件,它将由另一个程序生成,详细说明哪台机器有哪些文件Linux 在shell脚本中将文件从两台机器移动到四台机器,linux,bash,shell,unix,scp,Linux,Bash,Shell,Unix,Scp,我正在做一个项目,我需要将文件从一台机器移动到另一台机器。所有的机器都是Ubuntu机器,它运行的是Ubuntu 12.04。所以我想,我可以直接scp文件 下面是我的文本文件,它将由另一个程序生成,详细说明哪台机器有哪些文件 { dbx45.dc1.host.com=[0, 1024, 4, 1028], dbx46.dc1.host.com=[1, 1025, 5, 1029], dbx47.dc1.host.com=[2, 1026, 6, 1030], dbx48.dc1.h
{ dbx45.dc1.host.com=[0, 1024, 4, 1028],
dbx46.dc1.host.com=[1, 1025, 5, 1029],
dbx47.dc1.host.com=[2, 1026, 6, 1030],
dbx48.dc1.host.com=[3, 1027, 7, 1031] }
在上面的文本文件中,我有一组key=value
对组合,其中key是客户端机器名
,value是每台机器负责的文件名。例如在上面的文件中
dbx45.dc1.host.com is the client machine responsible for 0 file name, 1024 file name, 4 file name, 1028 file name.
dbx46.dc1.host.com is the client machine responsible for 1 file name, 1025 file name, 5 file name, 1029 file name.
dbx47.dc1.host.com is the client machine responsible for 2 file name, 1026 file name, 6 file name, 1030 file name.
dbx48.dc1.host.com is the client machine responsible for 3 file name, 1027 file name, 7 file name, 1031 file name.
现在,所有文件都只驻留在这两台机器中,如下所述。这意味着,文件随机分布在下面两台机器中,因此并非只有一台机器包含所有文件
slc4b03.dc1.host.com
chd1b02.dc2.host.com
上述两台计算机中的所有文件都位于此文件夹中-
/bat/data/snapshot/
例如,文件名如下所示-
`t1_weekly_0_200003_5.data` (this is for file 0)
`t1_weekly_1024_200003_5.data` (this is for file number 1024)
`t1_weekly_4_200003_5.data` (this is for file number 4)
and similarly for others as well.
现在的问题是
阅读txt文件,找出哪个客户端计算机负责哪些文件
然后相应地从这两台机器中提取这些文件(如果它不在一台机器中,那么它将在第二台机器中),并将(scp)文件放在路径(/export/home/username/primary)
中相应的客户机中
我想我可以从任何机器上运行这个shell脚本,因为我们只是对它进行scp(-ing)
我不知道如何在shell脚本中实现这一点?有什么想法吗
更新:-
文件号在文件名中
此文件-t1\u weekly\u 0\u 200003\u 5。数据
用于文件0。类似地,这个文件是-t1\u weekly\u 1024\u 200003\u 5。数据
用于文件1024。部分回答:只需稍加修改即可将数据结构读入Perl(Perl完全能够处理)。此代码获取显示的数据文件,并将其转换为此代码打印的结构:
#!/usr/bin/env perl
use strict;
use warnings;
# Slurp input into $data
my $data;
{
local $/;
$data = <>;
}
print "data = <<$data>>\n";
# Convert to eval-able format
$data =~ s/{/ \$x = {/m;
$data =~ s/}/};/m;
$data =~ s/([^ ]+)=/"$1" => /gm;
print "data = <<$data>>\n";
# Eval it
my $x;
eval $data;
# Dump the data structure
foreach my $key (keys %{$x})
{
foreach my $val (@{$x->{$key}})
{
print "$key: $val\n";
}
}
#/usr/bin/env perl
严格使用;
使用警告;
#Slurp输入到$data中
我的$数据;
{
本地$/;
$data=;
}
打印“数据=\n”;
#转换为可评估格式
$data=~s/{/\$x={/m;
$data=~s/}/}/M
$data=~s/([^]+)=/“$1”=>/gm;
打印“数据=\n”;
#评估一下
我的$x;
eval$数据;
#转储数据结构
foreach my$key(key%{$x})
{
foreach my$val(@{$x->{$key})
{
打印“$key:$val\n”;
}
}
样本运行:
data = <<{ dbx45.dc1.host.com=[0, 1024, 4, 1028],
dbx46.dc1.host.com=[1, 1025, 5, 1029],
dbx47.dc1.host.com=[2, 1026, 6, 1030],
dbx48.dc1.host.com=[3, 1027, 7, 1031] }
>>
data = << $x = { "dbx45.dc1.host.com" => [0, 1024, 4, 1028],
"dbx46.dc1.host.com" => [1, 1025, 5, 1029],
"dbx47.dc1.host.com" => [2, 1026, 6, 1030],
"dbx48.dc1.host.com" => [3, 1027, 7, 1031] };
>>
dbx46.dc1.host.com: 1
dbx46.dc1.host.com: 1025
dbx46.dc1.host.com: 5
dbx46.dc1.host.com: 1029
dbx47.dc1.host.com: 2
dbx47.dc1.host.com: 1026
dbx47.dc1.host.com: 6
dbx47.dc1.host.com: 1030
dbx48.dc1.host.com: 3
dbx48.dc1.host.com: 1027
dbx48.dc1.host.com: 7
dbx48.dc1.host.com: 1031
dbx45.dc1.host.com: 0
dbx45.dc1.host.com: 1024
dbx45.dc1.host.com: 4
dbx45.dc1.host.com: 1028
数据=
数据=[0,1024,4,1028],
“dbx46.dc1.host.com”=>[11025,51029],
“dbx47.dc1.host.com”=>[21026,61030],
“dbx48.dc1.host.com”=>[31027,71031]};
>>
dbx46.dc1.host.com:1
dbx46.dc1.host.com:1025
dbx46.dc1.host.com:5
dbx46.dc1.host.com:1029
dbx47.dc1.host.com:2
dbx47.dc1.host.com:1026
dbx47.dc1.host.com:6
dbx47.dc1.host.com:1030
dbx48.dc1.host.com:3
dbx48.dc1.host.com:1027
dbx48.dc1.host.com:7
dbx48.dc1.host.com:1031
dbx45.dc1.host.com:0
dbx45.dc1.host.com:1024
dbx45.dc1.host.com:4
dbx45.dc1.host.com:1028
您需要考虑如何处理来自那里的数据,但至少您有一个结构,可以根据该结构确定在给定的机器上保存哪些文件。您可以轻松地创建反向索引列表,列出每个文件保存在哪台机器上
您可以(也可能应该)在修改和评估数据之前添加一些数据验证,以最大限度地减少恶意用户向数据文件中输入危险内容的可能性。(许多程序都读取可执行代码(想想某些办公产品中的宏)from disk很容易被恶意代码欺骗。不要让你的程序成为其中之一!不是答案,因为它不是bash,但你肯定需要调查fabric-它非常适合此用例。@cforbish:我能够读取文件,但不确定如何将这些值存储在数据结构中,然后相应地提取f来自这两台机器的文件。看起来很简单。显示文件名和文件号之间关系的文件格式是什么?我的意思是告诉你t1_weeklyxyz是文件0的文件?@MarkSetchell。例如,这个文件名是t1_weekly_0_200003_5。数据
是我在问题中提到的文件0。这个文件名是t1\u weekly\u 1024\u 200003\u 5.数据
用于文件号1024.文件号在文件名内。代码t1\u weekly
和200003
何时变化?从不?文件中由另一个程序生成的数据格式是否被Python识别?它不是一种Perl格式,尽管它很接近。或者可能有设置此方案的人员使用的另一种语言使解析控制数据(哪个文件在哪台机器上掌握)变得容易。如果有这样一种语言,它可能是值得使用的。文件列表的大小是否固定为每台机器4个,或者可以不同,并且不同机器的数量是一致的,还是也不同?机器的数量如何?