Bash grep'后保留ls着色;惯性导航与制导

Bash grep'后保留ls着色;惯性导航与制导,bash,grep,colors,ls,Bash,Grep,Colors,Ls,如果我这样做 $ ls -l --color=always 我在目录中得到了一个文件列表,并为不同的文件类型添加了一些漂亮的颜色等等 现在,我希望能够通过管道将ls的彩色输出通过grep过滤掉一些我不需要的文件。关键是我仍然希望在grep过滤器之后保留颜色 $ ls -l --color=always | grep -E some_regex ^我在格雷普之后失去了色彩 编辑:我使用的是无头服务器Ubuntu 8.10,Bash 3.2.39,基本上是一个没有花哨配置的库存安装你应该检查你是

如果我这样做

$ ls -l --color=always
我在目录中得到了一个文件列表,并为不同的文件类型添加了一些漂亮的颜色等等

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

$ ls -l --color=always | grep -E some_regex
^我在格雷普之后失去了色彩


编辑:我使用的是无头服务器Ubuntu 8.10,Bash 3.2.39,基本上是一个没有花哨配置的库存安装

你应该检查你是否真的使用了“真正的”ls,只需直接调用二进制:

/bin/ls ....
因为:您所描述的代码确实应该可以工作,除非ls忽略--color=总是因为一些奇怪的原因或bug


我怀疑某个别名或函数(直接或通过变量)添加了一些选项。仔细检查,确认情况并非如此。

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

您“可以”这样做:

然而,非常重要的一点是,您必须了解您在这里所做的
grep
ping。不仅
grep
ping
ls
是不必要的(而是使用
glob
),这种特殊情况下
grep
ping不仅通过文件名和文件统计,而且通过
ls
添加的颜色代码

你的问题的真正答案是:不要
grep
it。无需将
ls
导入任何内容或捕获其输出
ls
仅用于人工解释(例如,仅在交互式shell中查看,当然,出于此目的,它非常方便)。如前所述,您可以使用globs过滤
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)
我强烈建议您阅读这两份关于此事的优秀文件:

  • 解析
    ls
    的不良解释:
  • glob
    s的功率:

FWIW它对我有用吗。它可能与您正在使用的终端模拟器有关。像往常一样,shell编码在更高(和正常)的级别上++@lhunah我从未意识到这种做法有多糟糕,感谢链接,尽管我使用了一些高级正则表达式,但我会尝试将其迁移到glob,并在本地使用
ls
,感谢您让我看到了这一点。我通常会运行“find”并在将结果传递到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
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)