ls和正则表达式linux

时间:2016-02-25 17:38:28

标签: regex linux ls

我有两个目录:

  1. run.2016-02-25_01.
  2. run.2016-02-25_01.47.04
  3. 这两个目录都存在于名为gte的公共目录下。

    我想要一个没有点字符.结束的目录。

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

    ls run* | grep '.*\d+' 
    

    命令无法找到任何内容。

5 个答案:

答案 0 :(得分:3)

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

ls -d run*[!.]

^曾经是|的古老同义词。)-d选项列出了目录名,而不是这些目录的内容。

您尝试使用:

ls run* | grep '.*\d+'

需要启用PCRE的grep和PCRE正则表达式选项(-P),并且您要查找任意字符后跟一个或多个数字的零个或多个,这不是你说的你想要什么。你可以使用:

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

并不需要PCRE正则表达式,但只是让shell glob正确名称可能是最好的。

如果您担心可能没有名称以run开头并以点以外的其他内容结尾,您应该考虑shopt -s nullglob,如Anubhava中所述& #39; s answer。但是,请注意下面hek2mgl和我之间关于特别是ls命令与shopt -s nullglob一起可能造成混淆的行为的讨论。如果您使用:

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

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

答案 1 :(得分:1)

您不需要grep。只需使用:

shopt -s nullglob
ls -d run*[0-9]

如果您的目录并非始终以数字结尾,请使用extglob

shopt -s nullglob extglob
ls -d run*+([^.])

或列出{DAME:

结尾的run*目录内的所有条目
printf "%s\n" run*+([^.])/*

答案 2 :(得分:0)

这有效......

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

这就是说我想要任何数量的东西,但我希望除了一段时间之外,行结束前的最后一个字符是什么。

答案 3 :(得分:0)

我会使用find

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

答案 4 :(得分:0)

列出不以.结尾的目录。

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