【问题标题】:Hiding all directories that begin with a capitalized letter using `ls` in zsh在zsh中使用`ls`隐藏所有以大写字母开头的目录
【发布时间】:2021-05-05 15:40:48
【问题描述】:

我正在尝试在 zsh(在 macOS 上运行)中使用 ls 来显示除以大写字母开头的目录之外的所有文件和目录。

比如我的目录包含

存档/数据/README.md test.txt

我想运行一个只返回的ls 命令

数据/README.md test.txt

我可以使用ls -d [A-Z]*/(注意结尾的反斜杠表示目录)来显示我想要隐藏的目录(例如只返回Archive/),

并在 zsh 中使用 ls *~ 语法的反向扩展引用此 helpful answer

我尝试(我认为是)使用ls -d *~[A-Z]*/ 否定上述内容,但这不起作用(它没有隐藏任何内容)。

此外,使用ls -d *~[A-Z]*(没有终止反斜杠)返回data/ test.txt,但这不是我想要的结果,因为我还想显示以大写字母开头的文件README.md

请注意,我在 zsh 中启用了扩展 glob 选项,使用 setopt extendedglob

对于 zsh 中 ls 的正确正则表达式/glob 语法以获得我想要的输出的任何帮助,我们将不胜感激。谢谢! :)

编辑:有两个非常有用的答案,但是在 zsh 中使用 ls 的任何简洁答案(使用扩展 glob 选项)仍然很棒!

【问题讨论】:

    标签: regex unix zsh


    【解决方案1】:

    可能有点冗长,但您可以使用 ls -l 并使用 grep -v "^total" 阻止 total,然后将输出通过管道传输到 awk。

    在 awk 中,如果第一个字段以 d 开头并且最后一个字段不是以大写字符 A-Z 开头,则打印最后一个字段,后跟 /

    如果第一个字段不以d开头,则打印最后一个字段

    ls -l | grep -v "^total" | awk '{
      if ($1 ~ /^d/ && $NF ~ /^[^A-Z]/){
        print $NF"/"
      } else if ($1 ~ /^[^d]/){
        print $NF
      }
    }'
    

    在一行中:

     ls -l | grep -v "^total" | awk '{if($1~/^d/ && $NF~/^[^A-Z]/){print $NF"/"} else if($1~/^[^d]/){print $NF}}'
    

    【讨论】:

    • @xyzo 欢迎您。如果任何给定的答案有助于解决问题,请通过单击左侧的 ✓ 考虑 accept an answer。请注意,您会得到 2 reputation points 接受解决方案。从 15 个声望点中,您可以upvote) 给出您认为有用的答案。
    【解决方案2】:

    我的ls 版本不直接支持正则表达式,我认为您依赖于shell globbing。也许尝试管道到 grep。比如:

     ls  | grep -v  '^[A-Z].*'
    

    注意正则表达式是用引号引起来的。 ^ 指定字符串的开头。开关-v 是匹配的否定。

    抱歉,现在我更了解您的要求了。您可以使用字符串find 命令来执行此操作。请尝试以下操作:

    find -E . -regex "\./[^A-Z].*" -type d -exec echo Directory: {} ';' -exec find {} -type f -maxdepth 1 \; 
    

    我在具有以下层次结构的 Mac 上对此进行了测试:

    find .
    .
    ./Test
    ./Test/Plain File
    ./aatest
    ./aatest/BigTest
    ./aatest/BigTest/Big File
    ./aatest/BigTest/small File
    ./aatest/bb File
    ./aatest/aaFile
    

    得到以下输出:

    Directory: ./aatest
    ./aatest/bb File
    ./aatest/aaFile
    Directory: ./aatest/BigTest
    ./aatest/BigTest/Big File
    ./aatest/BigTest/small File
    

    请注意,我在 echo 命令中添加了文本“目录”以区分两种类型的输出。

    【讨论】:

    • 谢谢@Bill!这很有用。但是,它仍然存在同时隐藏大写的文件的问题,而不仅仅是大写的目录。
    • 感谢您的更新@Bill。这现在有效!然后我可以通过管道发送到ls 以获得所需的结果。理想情况下,我希望使用 ls 的语法上简单的函数,就像我在问题中尝试的代码一样,但这可以解决别名问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 2021-03-12
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多