【问题标题】:Preserve ls colouring after grep'inggrep'ing 后保留 ls 着色
【发布时间】:2010-10-26 10:56:21
【问题描述】:

如果我这样做了

$ ls -l --color=always

我得到了目录中的文件列表,其中包含不同文件类型等的漂亮颜色。

现在,我希望能够将ls 的彩色输出通过grep 过滤掉一些我不需要的文件。关键是我还想保留grep过滤后的颜色。

$ ls -l --color=always | grep -E some_regex

^ grep 后我失去了着色

编辑:我正在使用无头服务器 Ubuntu 8.10、Bash 3.2.39,几乎是一个没有花哨配置的库存安装

【问题讨论】:

  • FWIW 它对我有用。它可能与您使用的终端模拟器有关。

标签: bash grep colors ls


【解决方案1】:

您的 grep 可能正在删除 ls 的颜色代码,因为它打开了自己的颜色。

你“可以”这样做:

ls -l --color=always | grep --color=never pattern

但是,了解您在这里的grepping 到底是什么非常重要。不仅grepping ls 是不必要的(使用glob 代替),这种特殊情况是grepping 不仅通过文件名和文件统计信息,还通过ls 添加的颜色代码!

您问题的真正答案是:不要grep 它。永远不需要将ls 传送到任何东西或捕获其输出。 ls 仅用于人类解释(例如,仅在 interactive shell 中查看,当然,为此目的它非常方便)。如前所述,您可以使用 glob 过滤 ls 枚举的文件:

ls -l *.txt      # Show all files with filenames ending with `.txt'.
ls -l !(foo).txt # Show all files with filenames that end on `.txt' but aren't `foo.txt'. (This requires `shopt -s extglob` to be on, you can put it in ~/.bashrc)

强烈建议您阅读这两个关于此事的优秀文档:

【讨论】:

  • 像往常一样,shell 编码在更高(和理智)的级别上。 ++
  • @lhunath 我从来没有意识到这种做法有多糟糕,感谢您的链接,虽然我使用了一些高级正则表达式,但我会尝试将其迁移到 glob 并在 ls
  • 感谢您让我大开眼界。我通常会运行“查找”并查看在将结果传送到 xargs 之前会出现什么
  • @orange80:不要将 find(1) 输出通过管道传输到 xargs(1)。 xargs 是一个损坏的工具,因为它试图“聪明”并在有空格和引号的地方破坏您的输入文件名。没有人应该使用 xargs (除了您使用 -0 的罕见情况,它几乎总是有更好的选择)。相反,只需使用 find 的 -exec 命令 {} +。它的作用与 xargs 完全相同,只是它不会破坏您的文件名(而且您没有管道 + 额外的解析 + 额外的进程开销)。
  • 不错。 AFAIK 无法使用 glob 过滤符号链接,如本例所示:ls -l --color=always /dev/disk/by-uuid/ | grep --color=never sda
【解决方案2】:

你应该通过直接调用二进制文件来检查你是否真的在使用“真正的”ls:

/bin/ls ....

因为:您描述的代码确实应该可以工作,除非 ls 由于某些奇怪的原因或错误而忽略 --color=always。

我怀疑某些别名或函数会(直接或通过变量)添加一些选项。仔细检查情况是否如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2014-10-24
    • 2011-01-20
    • 2011-06-19
    相关资源
    最近更新 更多