如何使用bash shell脚本找出其他机器上的所有文件?

如何使用bash shell脚本找出其他机器上的所有文件?

我试图找出哪些文件在machineB以及哪些文件在machineC.

我需要运行我的 shell 脚本来machineA找出哪些文件在其中machineB以及哪些文件在machineC

我有大约 300 个文件分布在machineB和中machineC

现在我想找出哪个文件在哪台机器上(machineB or machineC)

下面是我正在运行的 shell 脚本machineA,它PRIMARY_PARTITION有一些文件号和SECONDARY_PARTITION一些文件号。这些文件存在于该目录中 -

/data/snapshot/20140317

machineBmachineC..文件路径是这样的 -

t1_1980_0_200003_5.data
t1_1980_3_200003_5.data
t1_1980_5_200003_5.data
t1_1980_7_200003_5.data
t1_1980_9_200003_5.data

这里的文件编号是 0、3、5、7、9。filename除了文件编号之外,其他名称始终相同。

#!/bin/bash

readonly FILERS_LOCATION=(machineB machineC)
readonly MEMORY_MAPPED_LOCATION=/data/snapshot
PRIMARY_PARTITION=(0 3 5 7 9)
SECONDARY_PARTITION=(1 2 4 6 8)

dir1=20140317
dir2=20140317

echo $dir1
echo $dir2

if [ "$dir1" = "$dir2" ]
then
    for el in "${PRIMARY_PARTITION[@]}"
    do
        # do something here may be?
    done
    for sl in "${SECONDARY_PARTITION[@]}"
    do
        # do something here may be?
    done
fi

现在我的问题是如何找到machineB和中的所有文件machineC。含义 out of(0 3 5 7 9)以及(1 2 4 6 8)哪些文件在 中machineB以及哪些文件在 中machineC

作为示例,我在上面显示了非常小的文件集。一般来说,我有很多文件,我认为登录 machineB 和 machineC 来查找这些文件相当困难。

答案1

我能立即想到两种方法。第一个涉及使用rsync第二个是使用ssh&的组合diff

笔记:这两种方法都会将机器 A 上包含所有文件的目录与机器 B 和 C 上的这些文件的子集进行比较,以显示哪台机器(B 或 C)是所述文件的发起者。

示例数据

假设我在 machineA 上有以下文件设置。

$ ls
t1_1980_10_200003_5.data  t1_1980_4_200003_5.data  t1_1980_8_200003_5.data
t1_1980_1_200003_5.data   t1_1980_5_200003_5.data  t1_1980_9_200003_5.data
t1_1980_2_200003_5.data   t1_1980_6_200003_5.data
t1_1980_3_200003_5.data   t1_1980_7_200003_5.data

方法#1 - rsync

现在让我们找出该目录中的哪些文件来自 machineB。

$ rsync --dry-run -avz machineB:~/20140317/ .
receiving incremental file list
./
t1_1980_1_200003_5.data
t1_1980_2_200003_5.data
t1_1980_3_200003_5.data
t1_1980_4_200003_5.data
t1_1980_5_200003_5.data

sent 29 bytes  received 165 bytes  129.33 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

而机器C:

$ rsync --dry-run -avz machineC:~/20140317/ .
receiving incremental file list
./
t1_1980_10_200003_5.data
t1_1980_6_200003_5.data
t1_1980_7_200003_5.data
t1_1980_8_200003_5.data
t1_1980_9_200003_5.data

sent 29 bytes  received 166 bytes  390.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

方法#2 - ssh + diff

作为替代方案,您可以使用一些半基本的方法sshdiff执行类似的操作。

$ cd /dir/with/machBC
$ diff -B <(ssh user@machineB "ls -R ~/20140317/") <(ls -R .)
> .:
> t1_1980_10_200003_5.data
> t1_1980_6_200003_5.data
> t1_1980_7_200003_5.data
> t1_1980_8_200003_5.data
> t1_1980_9_200003_5.data

答案2

如果我正确理解你的问题(大如果),我会在 machineA 上运行类似的东西:

#!/usr/bin/env bash

file_pattern='t1_1980_*_200003_5.data';
target_dir='/data/snapshot/20140317/'
## Save the files from each machine into bash array
files_on_B=$(ssh user@machineB find "$target_dir" -name "$file_pattern")
files_on_C=$(ssh user@machineC find "$target_dir" -name "$file_pattern")

## Do whatever you like with them, here I am simply printing
echo "Files from B: ${files_on_B[@]}"
echo "Files from C: ${files_on_C[@]}"

请注意,该脚本假定文件名正常,如您的示例所示,没有空格、换行符或其他奇怪的字符。

相关内容