Я пишу скрипт, который проверяет определенный каталог на наличие подкаталогов, начинающихся с определенного слова.
Вот мой сценарий на данный момент:
#!/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.