Используйте регулярное выражение, чтобы проверить, есть ли в определенном каталоге папки, начинающиеся с определенного слова

Используйте регулярное выражение, чтобы проверить, есть ли в определенном каталоге папки, начинающиеся с определенного слова

Я пишу скрипт, который проверяет определенный каталог на наличие подкаталогов, начинающихся с определенного слова.

Вот мой сценарий на данный момент:

#!/bin/bash

function checkDirectory() {
    themeDirectory="/usr/share/themes"
    iconDirectory="/usr/share/icons"
    # I don't know what to put for the regex. 
    regex=

    if [ -d "$themeDirectory/$regex" && -d "$iconDirectory/$regex" ]; then
       echo "Directories exist."
    else
       echo "Directories don't exist."
    fi
}

Итак, как бы вы regexпроверили, есть ли в определенном каталоге папки, начинающиеся с определенного слова?

решение1

-dне принимает регулярные выражения, принимает имена файлов. Если вы просто хотите проверить простой префикс, достаточно подстановочного знака:

exists=0
shopt -s nullglob
for file in "$themeDirectory"/word* "$iconDirectory"/* ; do
    if [[ -d $file ]] ; then
        exists=1
        break
    fi
done
if ((exists)) ; then
    echo Directory exists.
else
    echo "Directories don't exist."
fi

nullglobзаставляет подстановочные знаки расширяться до пустых списков, если совпадений нет. В более крупном скрипте измените его значение в подоболочке или верните старое значение, когда оно вам не нужно.

решение2

Если вы хотите найти только каталоги, соответствующие заданному шаблону/префиксу, я думаю, вы можете просто использовать find:

find /target/directory -type d -name "prefix*"

или, если вы только хотитенемедленныйподкаталоги:

find /target/directory -maxdepth 1 -type d -name "prefix*"

Конечно, есть также возможность, -regexесли вам нужно фактическое соответствие регулярному выражению. (Предостережение: я не помню, является ли -maxdepth гну-измом.)

(обновление) Правильно, вы хотели оператор if. Find всегда возвращает ноль, поэтому мы не можем использовать возвращаемое значение для проверки того, было ли что-то найдено (в отличие от grep). Но мы можем, например, посчитать строки. Передайте вывод, wcчтобы получить количество, а затем проверьте, не равно ли оно нулю:

if [ $(find /target/directory -type d -name "prefix*" | wc -l ) != "0" ] ; then
    echo something was found
else
    echo nope, didn't find anything
fi

решение3

Имя вашей переменной regexбудет выбрано не очень удачно, но рассмотрите возможность установки значения "$1"like regex="$1". Следующий шаг — изменить ifоператор с:

if [ -d "$themeDirectory/$regex" && -d "$iconDirectory/$regex" ]; then

к

if [ -d "$themeDirectory/$regex" ] && [ -d "$iconDirectory/$regex" ]; then

Сценарий будет выглядеть так:

function checkDirectory() {
    themeDirectory="/usr/share/themes"
    iconDirectory="/usr/share/icons"
    # I don't know what to put for the regex. 
    regex="$1"

    if [ -d "$themeDirectory/$regex" ] && [ -d "$iconDirectory/$regex" ]; then
       echo "Directories exist."
    else
       echo "Directories don't exist."
    fi
}

Из оболочки вы можете получить свой скрипт следующим образом:

. /path/to/script

И функция готова к использованию:

checkDirectory test
Directories don't exist.

Связанный контент