【问题标题】:ls and regular expression linuxls和正则表达式linux
【发布时间】:2016-02-25 17:38:28
【问题描述】:

我有两个目录:

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

这两个目录都存在于一个名为 gte 的公共目录下。

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

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

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

命令找不到任何东西。

【问题讨论】:

  • 我不确定你的正则表达式是否会做你想做的事,所以你可能想在之后仔细检查它,但你的直接问题是你应该将-d 选项传递给ls .否则,它将列出目录的内容,而不是目录本身。

标签: regex linux ls


【解决方案1】:

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,如Anubhavaanswer 中所述。但是,请注意下面hek2mgl 和我之间关于可能令人困惑的行为的讨论,特别是ls 命令与shopt -s nullglob 结合使用。如果您使用的是:

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

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

【讨论】:

  • @hek2mgl:真的吗?它适用于 Bash 3.2。 >xx1; >xx2; >xx.; ls xx[!.] 仅列出 xx1xx2(假设目录中没有其他以 xx 开头的 3 字符文件)。也在 Korn shell 中。
  • 谢谢!!正是我想要的:)
  • 呃,这似乎是我的测试设置的问题,但仍然很有趣:我创建了文件 test-232test-232.(注意 - 而不是 .) .但是,当我使用ls test.*[!.] 时,我得到test-232test-232.。我没想到会这样。我错过了什么吗?
  • 呃!再次我的测试设置!我有shopt -s nullglob 因为下面与anubhava 的讨论。我完全不是全球大师! :) 我没想到会出现这样的结果,因为nullglob。我希望我的测试结果为空。
  • 哦……当然……! (一旦被发现,它就很明显;在那之前,它很神秘。)shopt -s nullglob 意味着test.*[!.] 扩展为空,所以ls 列出了当前目录的内容,其中可能只包含我们正在使用的文件名查看它是否是为测试而创建的。这对我来说更明显——我在一个普通的工作目录中玩,所以我列出了很多文件。这就是为什么shopt -s nullglob 不是默认值的原因,我想。
【解决方案2】:

您不需要grep。只需使用:

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

如果您的目录并非总是以数字结尾,请使用 extglob:

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

或列出run* 目录中的所有条目,以不带点结尾:

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

【讨论】:

  • OP 希望文件夹没有一个点
  • 是的,对不起,我的解释相反。现在修复了
  • 好的。应该设置shopt -s nullglob,因为如果不存在这样的文件夹,当前代码会给你(字面意思)run*[0-9]/*
  • 好的,适合我。 /* 确保它是 a) 目录和 b) 不以点结尾的技巧很好! :)
【解决方案3】:

这行得通...

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

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

【讨论】:

    【解决方案4】:

    列出不以. 结尾的目录。

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

    【讨论】:

    • 不需要用斜线转义句点,因为句点在方括号内没有特殊含义。
    【解决方案5】:

    我会使用find

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2011-08-03
      • 1970-01-01
      相关资源
      最近更新 更多