30

如果我做

$ ls -l --color=always

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

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

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

^ grep 后我失去了颜色

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

4

2 回答 2

53

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

你“可以”这样做:

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

但是,了解您在grep此处 ping 的具体内容非常重要。不仅grepping是ls不必要的(使用 aglob代替),这种特殊情况grep不仅通过文件名和文件统计信息 ping,还通过ls!添加的颜色代码进行 ping。

你的问题的真正答案是:不要grep。永远不需要管道ls到任何东西或捕获它的输出。 ls仅用于人类解释(例如,仅在交互式外壳中查看,为此目的,它当然非常方便)。如前所述,您可以使用 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)

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

于 2009-05-15T11:13:04.657 回答
0

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

/bin/ls ....

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

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

于 2009-05-15T10:47:38.633 回答