machineB
どのファイルが含まれているのか、どのファイルが含まれているのかを調べようとしますmachineC
。
どのファイルが存在し、どのファイルが存在するかをmachineA
確認するには、シェルスクリプトを実行する必要があります。machineB
machineC
約300個のファイルmachineB
がmachineC
。
今、どのファイルがどのコンピュータにあるかを確認したいと思います(machineB or machineC)
。
以下は私が実行しているシェルスクリプト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
。でどのファイルがあり、どのファイルがあるかを意味します(0 3 5 7 9)
。(1 2 4 6 8)
machineB
machineC
たとえば、上記の非常に小さなファイルセットを表示しました。一般的にファイルが多すぎるので、machineB、machineCにログインしてファイルを見つけるのはかなり難しいと思います。
答え1
私はすぐに2つのアプローチを考えることができます。 1つ目は&の組み合わせを使用すること、rsync
2番目は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 - 再同期
それでは、このディレクトリのどのファイルが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[@]}"
このスクリプトは、例に示すように、ファイル名が空白、改行、またはその他の奇妙な文字なしで正常であると仮定します。