【问题标题】:Using grep and ls -a commands使用 grep 和 ls -a 命令
【发布时间】:2015-08-11 10:57:48
【问题描述】:

使用ls –agrep,您将如何使用单个grep 命令列出/usr 中以字母p、字母r 或字母s 开头的所有文件的名称?

这样对吗?

ls –a | grep [prs] /usr

【问题讨论】:

  • 直接在/usr 下或在/usr 下的任何级别?
  • 就在/usr下
  • echo /usr/[prs]*...

标签: linux shell unix grep ls


【解决方案1】:
 ls -a /usr | grep '^[prs]'

将从ls -a /usr(由换行符分隔的/usr 中的文件列表)的输出中选择以prs 字符之一开头的行。

这可能是你的老师所期望的,但这是错误的,或者至少不可靠。

文件名可以由多行组成,因为换行符与 Linux 或任何 unix 上的文件名中的任何字符一样有效。因此该命令不会返回名称以pqs 开头的文件,而是返回以pqs 开头的文件名行。通常,您无法可靠地对ls 的输出进行后处理。

-a 包含隐藏文件,即名称以. 开头的文件。由于您只想要以pqs 开头的那些,那是多余的。

注意:

ls /usr | grep ^[pqs]

会更加错误。首先^ 是一些shell 中的特殊字符,例如Bourne shell、rceszsh -o extendedglob(尽管在bash 或其他POSIX shell 中可以)。

然后,在大多数 shell(fish 是一个明显的例外)中,[pqs] 是一个通配符。这意味着 ^[qps] 将由 shell 扩展为与该模式匹配的文件列表(相对于当前目录)。

所以在那些像bash这样没有特别对待^的shell中,如果当前目录中有一个名为^p的文件,那将变成

ls /usr | grep ^p

如果在cshtcshzshbash -O failglob 中没有匹配的文件,您将收到一条错误消息并且该命令将被取消。在zsh -o extendedglob 中,^ 是一个通配符运算符,^[pqs] 表示除pqs 之外的任何文件。

【讨论】:

    【解决方案2】:

    如果您要查找文件,请不要使用ls。使用find 命令。

    find /usr -name '[prs]*'
    

    如果您不想在 /usr 下搜索整个树,请执行以下操作:

    find /usr -maxdepth 1 -name '[prs]*'
    

    【讨论】:

      【解决方案3】:

      @twalberg 的评论非常适合您提出的选项。 回显忽略隐藏文件,但当您只想要以 [prs] 开头的文件时,这些文件将被过滤。
      当您想要其他过滤器的隐藏文件时,类似的解决方案是 ls -ad /usr/[prs]*,其中 -d 选项禁止列出子目录。
      该解决方案还将显示完整路径,当您首先转到目录时可以抑制这一点。当您想留在当前目录中时,请为其使用子shell。当 /usr 目录不存在时,我使用 && 跳过 ls。

      (cd /usr && ls -ad [prs]*)
      

      【讨论】:

        【解决方案4】:

        我会ls 目录,然后才应用grep。此外,您缺少 ^ 字符,只能过滤出以这些字母开始的文件:

        $ ls -a /usr | grep ^[prs]
        

        【讨论】:

          【解决方案5】:

          为什么不直接

           find /usr -type f -name '[prs]*'
          

          【讨论】:

          • 因为这将遍历/usr 下的所有内容,而不仅仅是/usr 本身。
          • 这很容易用-maxdepth 参数解决。这肯定比解析ls 安全得多。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-28
          • 1970-01-01
          • 1970-01-01
          • 2014-01-02
          • 2014-12-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多