Linux 在shell脚本中将文件从两台机器移动到四台机器

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

我正在做一个项目,我需要将文件从一台机器移动到另一台机器。所有的机器都是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.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个,或者可以不同,并且不同机器的数量是一致的,还是也不同?机器的数量如何?