![如何使用bash shell脚本找出其他机器上的所有文件?](https://linux22.com/image/51695/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8bash%20shell%E8%84%9A%E6%9C%AC%E6%89%BE%E5%87%BA%E5%85%B6%E4%BB%96%E6%9C%BA%E5%99%A8%E4%B8%8A%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我试图找出哪些文件在machineB
以及哪些文件在machineC
.
我需要运行我的 shell 脚本来machineA
找出哪些文件在其中machineB
以及哪些文件在machineC
我有大约 300 个文件分布在machineB
和中machineC
。
现在我想找出哪个文件在哪台机器上(machineB or machineC)
。
下面是我正在运行的 shell 脚本machineA
,它PRIMARY_PARTITION
有一些文件号和SECONDARY_PARTITION
一些文件号。这些文件存在于该目录中 -
/data/snapshot/20140317
在machineB
或machineC
..文件路径是这样的 -
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
作为替代方案,您可以使用一些半基本的方法ssh
来diff
执行类似的操作。
$ 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[@]}"
请注意,该脚本假定文件名正常,如您的示例所示,没有空格、换行符或其他奇怪的字符。