Regex ls与正则表达式linux

Regex ls与正则表达式linux,regex,linux,ls,Regex,Linux,Ls,我有两个目录: run.2016-02-25\u 01. run.2016-02-25_01.47.04 这两个目录都位于名为gte的公共目录下 我想要一个没有点字符结尾的目录 我正在使用以下命令,但无法使其工作: ls run* | grep '.*\d+' 这些命令找不到任何内容。这是有效的 ls|grep '.*[^.]$' 也就是说,我想要任何数量的任何东西,但我希望行结束前的最后一个字符是除句点以外的任何东西。这很有效 ls|grep '.*[^.]$' 也就是说,我想要任何数

我有两个目录:

  • run.2016-02-25\u 01.
  • run.2016-02-25_01.47.04
  • 这两个目录都位于名为
    gte
    的公共目录下

    我想要一个没有点字符结尾的目录

    我正在使用以下命令,但无法使其工作:

    ls run* | grep '.*\d+' 
    
    这些命令找不到任何内容。

    这是有效的

    ls|grep '.*[^.]$'
    
    也就是说,我想要任何数量的任何东西,但我希望行结束前的最后一个字符是除句点以外的任何东西。

    这很有效

    ls|grep '.*[^.]$'
    

    也就是说,我想要任何数量的东西,但我希望行结束前的最后一个字符是除句点以外的任何东西。

    您不需要
    grep
    。只需使用:

    shopt -s nullglob
    ls -d run*[0-9]
    
    如果您的目录不总是以数字结尾,请使用
    extglob

    shopt -s nullglob extglob
    ls -d run*+([^.])
    
    或列出
    run*
    目录中以无点结尾的所有条目:

    printf "%s\n" run*+([^.])/*
    

    您不需要
    grep
    。只需使用:

    shopt -s nullglob
    ls -d run*[0-9]
    
    如果您的目录不总是以数字结尾,请使用
    extglob

    shopt -s nullglob extglob
    ls -d run*+([^.])
    
    或列出
    run*
    目录中以无点结尾的所有条目:

    printf "%s\n" run*+([^.])/*
    

    我会使用
    find

    find -regextype posix-awk -maxdepth 1 -type d -regex '-*[[:digit:]]+$'
    

    我会使用
    find

    find -regextype posix-awk -maxdepth 1 -type d -regex '-*[[:digit:]]+$'
    

    列出不以
    结尾的目录


    ls-d运行*|grep“[^.]$”

    列出不以
    结尾的目录


    ls-d run*|grep“[^.]$”

    shell globbing中的否定字符集使用
    ^

    ls -d run*[!.]
    
    ^
    曾经是
    |
    的古老同义词)
    -d
    选项列出目录名,而不是这些目录的内容


    您尝试使用:

    ls run* | grep '.*\d+'
    
    需要启用PCRE的
    grep
    和PCRE regex选项(
    -p
    ),并且您正在查找任何字符的零个或多个后跟一个或多个数字,这不是您所说的所需。您可以使用:

    ls -d run* | grep '[^.]$'
    
    这不需要PCRE正则表达式,但简单地让shell glob具有正确的名称可能是最好的

    如果你担心名字不可能是“代码”>运行< /代码>,而不是用一个点结束的话,你应该考虑<代码>商店-Null GLUB/<代码>,如S所提到的。但是,请注意下面我和我之间关于潜在混淆行为的讨论,特别是

    ls
    命令与
    shopt-s nullglob
    的结合。如果您正在使用:

    for name in run*[!.]
    do
        …
    done
    

    然后
    shopt-s nullglob
    是完美的;当glob表达式不匹配时,循环迭代零次。如果glob表达式是命令的参数,例如在没有命令行参数的情况下提供默认行为的
    ls
    ,那么它就不太好了。

    shell globbing中的否定字符集使用
    ^

    ls -d run*[!.]
    
    ^
    曾经是
    |
    的古老同义词)
    -d
    选项列出目录名,而不是这些目录的内容


    您尝试使用:

    ls run* | grep '.*\d+'
    
    需要启用PCRE的
    grep
    和PCRE regex选项(
    -p
    ),并且您正在查找任何字符的零个或多个后跟一个或多个数字,这不是您所说的所需。您可以使用:

    ls -d run* | grep '[^.]$'
    
    这不需要PCRE正则表达式,但简单地让shell glob具有正确的名称可能是最好的

    如果你担心名字不可能是“代码”>运行< /代码>,而不是用一个点结束的话,你应该考虑<代码>商店-Null GLUB/<代码>,如S所提到的。但是,请注意下面我和我之间关于潜在混淆行为的讨论,特别是

    ls
    命令与
    shopt-s nullglob
    的结合。如果您正在使用:

    for name in run*[!.]
    do
        …
    done
    

    然后
    shopt-s nullglob
    是完美的;当glob表达式不匹配时,循环迭代零次。如果glob表达式是命令的参数,例如在没有命令行参数的情况下提供默认行为的
    ls
    ,那么它就不太好了。

    我不确定您的正则表达式是否会执行您想要的操作,因此您可能希望在以后再次检查它,但是您当前的问题是应该将
    -d
    选项传递给
    ls
    。否则,它将列出目录的内容,而不是目录本身。我不确定您的正则表达式是否能满足您的要求,因此您可能希望在以后再次检查它,但您当前的问题是您应该将
    -d
    选项传递到
    ls
    。否则,它将列出目录的内容,而不是目录本身。OP希望文件夹没有dotYes抱歉,我的解释正好相反。现在修好了。可能应该设置
    shopt-s nullglob
    ,因为如果不存在这样的文件夹,当前代码将为您(字面上)提供
    run*[0-9]/*
    Ok,对我有效。确保它是a)一个目录,b)不以点结尾的
    /*
    技巧很好:)OP想要没有dotYes的文件夹抱歉我解释了相反的内容。现在修好了。可能应该设置
    shopt-s nullglob
    ,因为如果不存在这样的文件夹,当前代码将为您(字面上)提供
    run*[0-9]/*
    Ok,对我有效。确保它是a)一个目录,b)不以点结尾的
    /*
    技巧很好:)不需要用斜杠转义句号,因为句号在方括号内没有特殊意义。不需要用斜杠转义句号,因为句号在方括号内没有特殊意义。@hek2mgl:真的吗?它适用于我的Bash3.2<代码>>xx1;>xx2;>xx。;ls xx[!.]
    仅列出
    xx1
    xx2
    (假设目录中没有其他以
    xx
    开头的3字符文件)。也在Korn shell。谢谢!!正是我所说的