bashシェルスクリプトを使用して他のコンピュータ上のすべてのファイルを見つける方法は?

bashシェルスクリプトを使用して他のコンピュータ上のすべてのファイルを見つける方法は?

machineBどのファイルが含まれているのか、どのファイルが含まれているのかを調べようとしますmachineC

どのファイルが存在し、どのファイルが存在するかをmachineA確認するには、シェルスクリプトを実行する必要があります。machineBmachineC

約300個のファイルmachineBmachineC

今、どのファイルがどのコンピュータにあるかを確認したいと思います(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

今私の質問machineBmachineC。でどのファイルがあり、どのファイルがあるかを意味します(0 3 5 7 9)(1 2 4 6 8)machineBmachineC

たとえば、上記の非常に小さなファイルセットを表示しました。一般的にファイルが多すぎるので、machineB、machineCにログインしてファイルを見つけるのはかなり難しいと思います。

答え1

私はすぐに2つのアプローチを考えることができます。 1つ目は&の組み合わせを使用すること、rsync2番目は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[@]}"

このスクリプトは、例に示すように、ファイル名が空白、改行、またはその他の奇妙な文字なしで正常であると仮定します。

関連情報