Как найти папки, в имени которых есть строки - PullRequest
0 голосов
/ 30 апреля 2019

EDIT: Нашел возможное решение, см. Ниже, но мне также нужна помощь, чтобы сделать его быстрее.

Я хочу покопаться в папке, содержащей папки, и скопировать каждую папку, имя которой содержит несколько строк, но я довольно застрял. На данный момент структура, с которой я пришел:

#!/opt/bin/sh

EXCLUSIVECOUNTRIES="it,ch"
ONLYFROMCOUNTRIES=$(echo $EXCLUSIVECOUNTRIES | tr "," "\n")
FORCEPROTOCOL= # can be tcp udp or empty, that catch both

if [ $(echo "$FORCEPROTOCOL" | tr '[:upper:]' '[:lower:]') == "tcp" ]; then # tcp protocol
    PROTOCOL="tcp"
elif [ $(echo "$FORCEPROTOCOL" | tr '[:upper:]' '[:lower:]') == "udp" ]; then
    PROTOCOL="udp"
else
    PROTOCOL="\w"
fi

for dirz in $(find /opt/serverconfigs/ -type d | grep -Ei $PROTOCOL); do
    if [ ! -z $ONLYFROMCOUNTRIES ]; then # exclusive contry present, copy only what I need
        echo "cp "$dirz" to
    else # no exclusive contry, so copy all
        for country in $ONLYFROMCOUNTRIES; do # for each contry
            if [ $(echo $(basename "$dirz") | sed -En 's/^([a-z\-]+).*/\1/p') == "$country" ]; then
                echo "$dirz"
            fi
        done
    fi
done

Но когда я запускаю его, я получаю

sh: ch: unknown operand
cp /opt/serverconfigs/de0515udp to
sh: ch: unknown operand
cp /opt/serverconfigs/de0119udp to
sh: ch: unknown operand
cp /opt/serverconfigs/nl-uk0002tcp to
sh: ch: unknown operand
cp /opt/serverconfigs/us2062udp to
sh: ch: unknown operand
cp /opt/serverconfigs/us3415udp to
sh: ch: unknown operand

Моя структура папок:

/opt/serverconfigs/br0031tcp
/opt/serverconfigs/be0097udp
/opt/serverconfigs/uk1088tcp
/opt/serverconfigs/us3270udp
/opt/serverconfigs/ca0313tcp
/opt/serverconfigs/tw-hk0003tcp
/opt/serverconfigs/ro0036tcp
/opt/serverconfigs/uk1004udp
/opt/serverconfigs/us3242tcp
/opt/serverconfigs/uk1174tcp
/opt/serverconfigs/nl0294udp
/opt/serverconfigs/ro0034tcp
/opt/serverconfigs/dk0120tcp
/opt/serverconfigs/us3129tcp
/opt/serverconfigs/us2491tcp
/opt/serverconfigs/ca0075tcp
/opt/serverconfigs/uk1009udp
/opt/serverconfigs/us3188tcp
/opt/serverconfigs/it0081tcp
/opt/serverconfigs/ca0378udp
/opt/serverconfigs/au0216udp
/opt/serverconfigs/us2283tcp
/opt/serverconfigs/us3293tcp

Первая проблема заключается в том, что кажется, что она работает наизнанку, и я не понимаю, почему, а вторая проблема - неизвестный операнд, может быть, связаны? Я немного искал неизвестный операнд и, похоже, проблема с [] и $ (), но каждый раз, когда я пытаюсь заставить его работать, результат один и тот же

Что я делаю не так?

Я ожидаю найти всю папку, имя которой содержит EXCLUSIVECOUNTRIES var в сочетании с протоколом, и скопировать папку в другую позицию

Есть идея получше?

1 Ответ

0 голосов
/ 30 апреля 2019

Благодаря shellcheck и некоторой настройке я нашел решение, которое работает

#!/opt/bin/sh

EXCLUSIVECOUNTRIES="it,ch"
ONLYFROMCOUNTRIES=$(echo $EXCLUSIVECOUNTRIES | tr "," "\n")
FORCEPROTOCOL="" # can be tcp udp or empty, that catch both

if [ "$(echo "$FORCEPROTOCOL" | awk '{print tolower($0)}')" = 'tcp' ]; then # tcp protocol
    PROTOCOL="tcp"
elif [ "$(echo "$FORCEPROTOCOL" | awk '{print tolower($0)}')" = 'udp' ]; then # udp protocol
    PROTOCOL="udp"
else  # both protocols
    PROTOCOL="\w"
fi

for dirz in $(find /opt/serverconfigs/ -type d | grep -Ei $PROTOCOL); do
    if [ -n "$ONLYFROMCOUNTRIES" ]; then # exclusive country present, copy only what I need
        for country in $ONLYFROMCOUNTRIES; do # for each country
            if [ "$(echo "$(basename "$dirz")" | sed -En 's/^([a-z\-]+).*/\1/p')" = "$country" ]; then
                echo "$dirz"
            fi
        done
    else # no exclusive country, so copy all
        echo "cp $dirz to"
    fi
done

Проблема в том, что это довольно медленно, какой-нибудь способ сделать его лучше?Я должен искать в более чем 9 тыс. Папок

...