Como descobrir todos os arquivos em outras máquinas usando o script de shell bash?

1

Estou tentando descobrir quais arquivos estão em machineB e quais arquivos estão em machineC .

E preciso executar meu script de shell em machineA para descobrir quais arquivos estão em machineB e quais arquivos estão em machineC

Eu tenho cerca de 300 arquivos distribuídos em machineB e machineC .

Agora eu gostaria de descobrir qual arquivo está em qual máquina (machineB or machineC) .

Abaixo está meu script de shell que estou executando em machineA e PRIMARY_PARTITION tem alguns números de arquivo e SECONDARY_PARTITION tem alguns números de arquivo. E os arquivos estão presentes neste diretório -

/data/snapshot/20140317

em machineB ou machineC .. E o caminho do arquivo é assim -

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

Aqui, o número do arquivo é 0, 3, 5, 7, 9. Outros nomes no filename sempre serão iguais para além dos números de arquivo.

#!/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

Agora, minha pergunta é como descobrir todos os arquivos em machineB e machineC . Significado de (0 3 5 7 9) e (1 2 4 6 8) quais arquivos estão em machineB e quais estão em machineC .

Como exemplo, mostrei um conjunto muito pequeno de arquivos acima. Em geral, tenho muitos arquivos que estou achando muito difícil fazer login no machineB e no machineC para descobrir os arquivos.

    
por SSH 20.03.2014 / 02:27

2 respostas

2

Existem duas abordagens que posso pensar em cima da minha cabeça. A primeira envolveria o uso de rsync , a segunda seria usar uma combinação de ssh & %código%.

OBSERVAÇÃO: Ambas as abordagens comparam um diretório na máquinaA que tem todos os arquivos com um subconjunto desses arquivos nos computadores B e C da máquina, mostrando qual máquina (B ou C) foi o originador dos referidos arquivos.

Exemplo de dados

Digamos que eu tenha feito a seguinte configuração de arquivos no 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

Método 1 - rsync

Agora vamos descobrir quais arquivos nesse diretório vieram do 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)

Enquanto machineC:

$ 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)

Método 2 - ssh + diff

Como alternativa, você pode usar alguns diff e ssh semicolares para fazer algo semelhante.

$ 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
    
por 20.03.2014 / 03:27
1

Se eu entendi sua pergunta corretamente (big if), eu faria isso com algo assim rodando em 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[@]}"

Observe que o script pressupõe nomes de arquivos sensatos, como em seu exemplo, sem espaços, novas linhas ou outros caracteres estranhos.

    
por 20.03.2014 / 14:58