Compare dois arrays com seus respectivos diretórios no shell script?

0

Eu tenho matriz de arquivos primários e matriz de arquivos secundários no script de shell. Ambos os arrays conterão números de arquivos.

#!/bin/bash
pri=(958 955 675 703 936 933 930 927 908 905 902 899 709)
snd=(953 947 943 939 916 915 1023 889 1010 1054 977 970 966)

# directories where we need to compare
primary=/primaries
secondary=/secondaries

echo "primary files: ${pri[@]}"
echo "secondary files: ${snd[@]}"

# now compare files in primary array 'pri[@]' with '/primaries' directory. All files in primary array should be present in '/primaries' directory.
# and compare secondary array 'snd[@]' with '/secondaries' directory. All files in secondary array should be present in '/secondaries' directory.
# If any of the file is missing, log a message.

Agora, todos os arquivos na matriz primária pri[@] devem estar presentes nos diretórios /primaries e todos os arquivos na matriz secundária snd[@] devem estar presentes nos diretórios /secondaries . O nome do arquivo é assim nos dois diretórios proc_1041_test.data . Aqui 1041 é o número do arquivo.

Como posso comparar o número do arquivo da matriz primária com arquivos nos diretórios primários e de forma semelhante para os secundários também?

Nota: os diretórios /primaries e /secondaries podem ter subdiretórios neles, portanto, só preciso procurar arquivos nesses dois diretórios pai apenas em nenhum dos subdiretórios.

    
por user1950349 15.04.2018 / 09:38

1 resposta

2

Para um dos arrays:

for num in "${pri[@]}"; do
    name="proc_${num}_test.data"
    if [ ! -f "$primary/$name" ]; then
        printf '"%s" not found in "%s"\n' "$name" "$primary" >&2
    fi
done

Ou seja, faça um loop sobre os números na matriz, construa o nome do arquivo esperado e teste se o nome de arquivo esperado existe¹ no diretório. Se isso não acontecer, escreva uma mensagem de diagnóstico no fluxo de erro padrão.

Fazendo os dois conjuntos de arquivos de uma só vez:

set -- "$primary" "$secondary"

typeset -n array
for array in pri snd; do
    for num in "${array[@]}"; do
        name="proc_${num}_test.data"
        if [ ! -f "$1/$name" ]; then
            printf '"%s" not found in "%s"\n' "$name" "$1" >&2
        fi
    done
    shift
done

Isso introduz uma variável de referência de nome array . Ao acessar ${array[@]} , a variável cujo nome foi atribuído a array (no loop, primeiro pri , em seguida, snd ) será acessada.

Os nomes dos diretórios $primary e $secondary são atribuídos aos parâmetros posicionais $1 e $2 antes do loop usando set , e dentro do loop nós shift $2 into $1 quando nós terminamos com o original $1 .

¹ e é um arquivo regular (ou um link simbólico para um arquivo normal acessível), mude para [ ! -e "$primary/$name" ] && [ ! -L "$primary/$name" ] para verificar se o arquivo existe independentemente de seu tipo.

    
por 15.04.2018 / 09:43