匹配只包含数字的特定长度的文件?

时间:2013-12-12 02:27:13

标签: regex bash shell

我一直在尝试匹配目录中长度为6个字符并且只包含数字的所有文件名。我一直在试图让它上班,但没有运气。这就是我所拥有的:

for f in "$path"*
do
        if echo "$f" | tail -c 7 | grep "^[[:digit:]][:digit:]]*$"; then
                echo "$f is good"
        else
                echo "$f" | tail -c 7
        fi
done

每次运行脚本时,else都会运行,我只从目录中的每个文件中获取最后6个字符。我不想让cd进入目录来检查文件,所以我想最后6个并检查是个好主意(也许不是)。我想最终重定向$ path中所有6个字符长和所有数字的文件。我只是想弄清楚如何匹配这个。谢谢!

3 个答案:

答案 0 :(得分:2)

这是一个只列出文件名的单行:

for f in "$path"[0-9][0-9][0-9][0-9][0-9][0-9];do echo ${f##*/};done

如果您想要完整路径,只需省略##*/

答案 1 :(得分:1)

ls [0-9][0-9][0-9][0-9][0-9][0-9]

或者,如果您只是想编辑脚本:

for f in "$path"*
do
    if echo "$f" | tail -c 7 | grep "^[[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]]$"; then
            echo "$f is good"
    else
            echo "$f" | tail -c 7
    fi
done

或者,只使用正则表达式:

'^[[:digit:]]{6}$'

答案 2 :(得分:1)

使用basename获取路径名的文件名部分,并测试:

for f in "$path"*
do
    base=$(basename "$f")
    case "$base" in
        [0-9][0-9][0-9][0-9][0-9][0-9])
            echo "$f is good" ;;
        *) echo "$base" ;;
    esac
done