Bash faz um loop através de todos os diretórios dentro de um diretório e, se encontrar alguma instância de string em cada arquivo específico de diretórios, faça isso

1

Eu tenho um serviço que utiliza uma porta específica do usuário para conexões remotas. Eu instalo várias instâncias deste serviço e escrevo um script bash para automatizar as instalações. Meu instalador tem uma verificação incorporada para evitar que minha própria estupidez tente vincular-se a portas já configuradas em instâncias instaladas anteriormente. Anteriormente eu estava usando o lsof assim ...

if [[ -z $(lsof -i :${service_port}) ]]; then

Funcionou muito bem até que percebi que, às vezes, eu alternava instâncias por períodos de tempo e o lsof apenas verifica portas atualmente em uso.

Então, agora estou voltando a extrair os arquivos de configuração (legal? não mais a dependência lsof) de cada instância, que são pequenos e têm apenas cerca de 5kb cada para percorrer rapidamente.

Eu tentei isso inicialmente (cada instalação está em sua própria pasta em installs_dir) ...

while read -e -p "Port: " -i "" service_port; do
    for each_install in "${installs_dir}/"*
    do
        if grep -q Port=${service_port} "$each_install"/main.cfg; then
            printf "Port ${service_port} in use, try another port\n"
            break
        else
            # Write Config
        fi
    done
done

Mas é acionado em cada diretório, é claro. Existe uma maneira de fazer isso escrever apenas uma vez sem fazer um sanduíche de loop while ou possivelmente outro comando que não precise procurar por todos os arquivos?

    
por d3c0y 04.01.2015 / 05:22

1 resposta

1

Descobri isso ... Apenas tive que usar o sinalizador -c para contar as correspondências no grep, -q para mantê-lo limpo e silencioso, sair do loop for e certificar-se de que não houve correspondências.

installs_dir="/my/dir"
while read -e -p "Service Port: " -i "" service_port; do
    s=0
    for each_install in "${installs_dir}/"*; do
        while grep -cq Port=${service_port} ${each_install}/main.cfg; do
            let "s++"
            break
        done
    done
    [ ${s} != 0 ] && printf "A server is already assigned to that port, try again.\n"
    [ ${s} == 0 ] && printf "Port assigned.\n" && break
done
    
por 04.01.2015 / 11:39