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

1

Eu tenho um serviço que utiliza uma porta especificada pelo usuário exclusiva para conexões remotas. Eu instalo várias instâncias deste serviço e escrevi um script bash para automatizar as instalações. Meu instalador possui uma verificação interna para impedir que minha própria estupidez tente ligar às portas já configuradas nas instâncias instaladas anteriormente. Anteriormente, eu estava usando lsof assim ...

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

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

Então, agora estou voltando a raspar os arquivos de configuração (legal? Sem mais lsof de dependência) de cada instância, que são pequenas, apenas cerca de 5kb cada uma, rápidas para percorrer.

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 essa gravação apenas uma vez sem fazer um sanduíche de loop while ou possivelmente outro comando que não precise pesquisar em todos os arquivos?

d3c0y
fonte

Respostas:

1

Entendi ... Só tinha que usar o sinalizador -c para contar correspondências no grep, -q para mantê-lo limpo e silencioso, sair do loop for e verificar se não havia 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
d3c0y
fonte