用于处理目录的Bash脚本(REGEX)

时间:2013-12-03 17:07:24

标签: regex linux bash

我似乎无法在我的bash脚本中使用正则表达式来运行:

#!/bin/bash
cd /var/lib/gitolite/repositories
for D in *; do
    if [ -d "${D}" ]; then
        if [["${D}" = [^[0-9A-Za-z\-_].git$] ]]; then
            echo "${D}"
        fi
    fi
done

目录的可能名称:

test.git
test-admin12.git
test_admin.git
test_admin.git.bkp (these are the folders I DON'T want)

我不想启动辅助流程,例如:sed或grep或ls

3 个答案:

答案 0 :(得分:2)

而不是:

if [["${D}" = [^[0-9A-Za-z\-_].git$] ]]; then
   echo "${D}"
fi

使用此条件并使用正确的语法和正确的正则表达式:

[[ "${D}" =~ ^[0-9A-Za-z_-]+\.git$ ]] && echo "${D}"

答案 1 :(得分:1)

如果启用扩展模式,则可以编写单个glob以匹配有效目录。

shopt -s extglob
for D in +([[:alnum:]_-]).git/; do
    echo "$D"
done

符号+(...)与一个或多个封闭模式匹配。括号匹配单个字母数字字符,下划线或连字符之一(如果它是括号中的最后一个字符,则不需要转义)。尾部斜杠限制与目录匹配。

答案 2 :(得分:1)

这对我有用(对你的if语句略有改动):

for D in *; do
    if [ -d "${D}" ]; then
        if [[ ^[0-9A-Za-z_-]*\.git$ ]]; then
            echo "${D}"
        fi
    fi
done