ls 和正则表达式 linux

ls and regular expression linux

我有两个目录:

  1. run.2016-02-25_01.
  2. run.2016-02-25_01.47.04

这两个目录都位于一个名为 gte.

的公共目录下

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

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

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

命令找不到任何东西。

这有效...

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

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

你不需要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:]]+$'

列出不以 . 结尾的目录。

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

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's . However, note the discussion below between hek2mgl 和我自己关于潜在的混淆行为,特别是 ls 命令与 shopt -s nullglob 结合使用。如果您使用的是:

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

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