grep'ing后保留ls着色

duc*_*lip 23 bash grep ls colors

如果我做

$ ls -l --color=always
Run Code Online (Sandbox Code Playgroud)

我得到了一个目录中的文件列表,为不同的文件类型等提供了一些很好的着色.

现在,我希望能够管理ls直通的彩色输出grep来过滤掉一些我不需要的文件.关键是我仍然想在grep过滤器后保留着色.

$ ls -l --color=always | grep -E some_regex
Run Code Online (Sandbox Code Playgroud)

^ grep后我失去了色彩

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

lhu*_*ath 49

你的grep可能正在删除ls它的颜色代码,因为它有自己的颜色打开.

你"可以"做到这一点:

ls -l --color=always | grep --color=never pattern
Run Code Online (Sandbox Code Playgroud)

但是,了解您在grep这里的确切内容非常重要.不仅grepping 是ls不必要的(使用glob替代),这个特殊情况grep不仅通过文件名和文件统计信息ping,还通过添加的颜色代码ls!

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

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

  • @ orange80:不要将find(1)输出管道输出到xargs(1).xargs是一个破碎的工具,因为它试图"聪明"并打破你的输入文件名,其中有空格和引号.没有人应该使用xargs(除了你使用-0的罕见情况,它几乎总是更好的选择).相反,只需使用find的-exec命令{} +.它与xargs完全相同,除了它不会强奸你的文件名(并且你没有管道+额外的解析+额外的进程开销). (4认同)
  • 像往常一样,shell编码在更高(和理智)的水平上.++ (2认同)