Bash przechodzi przez wszystkie katalogi w katalogu i jeśli znajdzie jakieś wystąpienie łańcucha w każdym katalogu, plik ten robi

1

Mam usługę, która wykorzystuje unikalny port określony przez użytkownika do połączeń zdalnych. Instaluję wiele instancji tej usługi i napisałem skrypt bash, aby zautomatyzować instalacje. Mój instalator ma wbudowaną funkcję sprawdzającą, która uniemożliwia mojej głupocie próbę powiązania z portami już skonfigurowanymi na wcześniej zainstalowanych instancjach. Wcześniej korzystałem z lsof tak ...

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

Pracowałam świetnie, dopóki nie zdałam sobie sprawy, że czasami wyłączam instancje na okresy czasu, a lsof sprawdza tylko aktualnie używane porty.

Więc teraz wracam do skrobania plików konfiguracyjnych (fajne? Nie więcej zależności od lsof) każdej instancji, które są małe tylko około 5kb każdy szybko się iterują.

Próbowałem tego początkowo (każda instalacja jest w swoim własnym folderze w katalogu 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

Ale oczywiście strzela w każdym katalogu. Czy istnieje sposób, aby napisać to tylko raz, bez tworzenia kanapki z pętlą while lub innej komendy, która nie musi przeszukiwać wszystkich plików?

d3c0y
źródło

Odpowiedzi:

1

Domyśliłam się... Wystarczyło użyć flagi -c, aby policzyć dopasowania w grep, -q, aby zachować czystość i spokój, wyjść poza pętlę for i upewnić się, że nie ma żadnych dopasowań.

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
źródło