如何删除`ls -color`输出中的dir背景

时间:2016-11-13 14:16:46

标签: linux shell terminal ls

我使用默认的Linux Mint .bashrc,这里是full bashrc,输出如下:

enter image description here

某个目录有绿色背景,如何删除它?

4 个答案:

答案 0 :(得分:8)

快速解决方案:

在Bash命令行中输入以下两个命令:

dircolors -p | sed 's/;42/;01/' > ~/.dircolors
source ~/.bashrc

说明:

有一个程序dircolors用于设置ls的配置。 默认的~/.bashrc脚本使用以下行加载配置:

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"

因为默认情况下文件~/.dircolors实际上不存在,所以脚本使用内置的Bash配置(eval "$(dircolors -b)")。

要删除o+w(由w的{​​{1}}标记中最后一个'drwxrwxrwx'标记为'可被他人写'的权限)的绿色背景,则需要创建此背景基于当前(内置)配置的文件。在命令行中键入以下内容:

ls

dircolors -p > ~/.dircolors 打印当前配置,dircolor -p将输出重定向到给定文件。

现在在编辑器中打开文件并找到以下行:

>

将数字OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky (表示绿色背景)更改为42(无背景)并保存更改。或者,您可以直接从命令行使用01程序及其替换功能(sed语法)来完成此操作:

's/PATTERN/NEW_STRING/'

通过使用管道'sed -i 's/;42/;01/' ~/.dircolors '的单个命令可以完成2件事:

|

要使更改生效(不重新启动shell),请输入:

dircolors -p | sed 's/;42/;01/' > ~/.dircolors

答案 1 :(得分:5)

要删除所有背景颜色,请将以下内容粘贴到〜/ .bashrc:

eval "$(dircolors -p | \
    sed 's/ 4[0-9];/ 01;/; s/;4[0-9];/;01;/g; s/;4[0-9] /;01 /' | \
    dircolors /dev/stdin)"

答案 2 :(得分:2)

dircolors -p的输出中给出了解释,例如,

screenshot with dircolors -p

当然dircolors没有为 输出着色。我用过这个脚本:

#!/usr/bin/perl -w

use strict;

our $comment = "\e[31m";
our $reset   = "\e[K\e[m";

our @data;

open my $fh, "dircolors -p|" or die "cannot read from dircolors";
@data = <$fh>;
close $fh;

printf "\e[H\e[2J";

for my $n ( 0 .. $#data ) {
    chomp $data[$n];
    if ( $data[$n] =~ /^\s*#/ ) {
        printf "%s%s%s\n", $comment, $data[$n], $reset;
    }
    elsif ( $data[$n] =~ /^\s*TERM\s/ ) {
        printf "%s\n", $data[$n];
    }
    elsif ( $data[$n] =~ /^\s*[^\s]+\s+\d+(;\d+)?\s*(#.*)?$/ ) {
        my $code = $data[$n];
        $code =~ s/^\s*[^\s]+\s+//;
        $code =~ s/\s.*//;
        my $data = $data[$n];
        $data =~ s/(#.*)$/$comment$1$reset/;
        $data =~ s/^(\s*)([^\s]+)(\s+)/$1\e[${code}m$2\e[m$3/;
        printf "%s\n", $data;
    }
    else {
        printf "%s\n", $data[$n];
    }
}

1;

要删除后台,您可以更改目录权限,也可以使用其他数据库来设置LS_COLORS环境变量。 dircolors documentation是值得去的地方。

答案 3 :(得分:1)

LS_COLORSls引用的用于为其输出着色的变量。如果未设置LS_COLORS,则使用幕后的dircolors生成。也可以使用dircolors手动设置是否启用/退出(请参见下面的 Vivid )。

如果大多数默认设置都可以使用,而您只想修复少数几个默认设置,最简单的方法就是将它们设置在.bashrc中。

LS_COLORS=$LS_COLORS:'tw=00;33:ow=01;33:'; export LS_COLORS

这将背景颜色(42)替换为普通(00)和粗体(01

  1. 设置了粘性位(tw)的其他可写目录
  2. 其他不带粘性位(ow)的可写目录

这是最简单的解决方案,因为我们保留其余的默认设置。

另一个答案的技术

# -b is make dircolors generate for bash
# sed replaces the offending background colors
# sed's output is fed as input for another instance of dircolors
# the entire subshell returns LS_COLORS that's `eval`uated
eval $(dircolors -b | sed 's/ 4[0-9];/ 01;/; s/;4[0-9];/;01;/g; s/;4[0-9] /;01 /' | dircolors /dev/stdin)

通过获取所有颜色值并用加粗(4[0-9])替换背景(01)来简单地进行此操作。


还有更好的选择,可以避免所有的手动操作:

  1. LS_COLORS
    • 为不同的扩展名计算的一组颜色
wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O $HOME/.config/LS_COLORS
echo 'eval $(dircolors -b "$HOME/.config/dircolors")' >> $HOME/.bashrc
  1. Vivid
    • 即时生成LS_COLORS
    • 多个主题
export LS_COLORS="$(vivid generate molokai)"

这两种工具的配色方案都不具有任何目录的背景色。