在ls输出中为硬链接上色?

如何自己给硬链接上色?事实证明,在我使用的旧版Ubuntu 10.04中,默认情况下会发生这种情况(使用相同的.bashrc和.profile文件),而在更新的Ubuntu 12.04上则不会。
以下是在Ubuntu 10.04上的输出结果(我所期望的结果):

Having the colored output for hardlinked files

这是在Ubuntu 12.04上的输出: Missing the colored output for hardlinked files 相关文件是.vimrc,然而.viminfo是一个普通文件,链接计数为1,与硬链接的.vimrc形成对比。
当然,GNU coreutils使用texinfo页面而不是man页面并不会让事情变得更容易。我找到了this here,但它并没有涉及我正在寻找的情况。 TL;DR: 如何在各个Ubuntu版本中以我喜欢的方式对颜色进行硬链接(即链接计数>1)文件的处理。

@gertvdijk: 请务必将此作为答案撰写出来。虽然这不是我希望得到的答案,但无疑它对该主题具有权威性,并解决了这个谜团。谢谢。 - 0xC0000022L
找到硬链接不是一项非常昂贵的操作吗?一些文件系统是否提供反向查找或至少每个索引节点的链接计数功能? - mike3996
2个回答

做这个:

LS_COLORS="mh=44;37" ls -l

而且你可以编辑你的~/.profile来相应地更改LS_COLORS

背景

这个功能在2008年默认启用,在2009年默认禁用。不知何故,Ubuntu 10.04 的冻结恰好处于这些时刻之间。

使用coreutils的Git仓库,我可以看到还原自动着色的提交已经从7.5版本开始存在:

git tag --contains 0df338f6719ec2bcf1e1dea2d8b12dc66daf8a1e
v7.5
v7.6
[...]

在7.1版本之前,似乎没有上游的维护支持。
git tag --contains 1e48b1fee5fa2ad2d1802771eafbfcddb38a24cb
v7.1
v7.2
[...]

源文件multihardlink.sh将我带到了确切的LS_COLORS值,以便再次启用它。
你可能想要重新打开LP Bug #123423

非常感谢。一点不差。目前唯一的问题是如何根据coreutils的版本有条件地进行操作 :) - 0xC0000022L
@0xC0000022L 已更新! - gertvdijk
在Ubuntu和Debian系统中,默认的.bashrc文件负责设置$LS_COLORS。在.bashrc(或者.bash_aliases)的末尾添加以下导出命令,以将.bashrc默认的$LS_COLORS与gertvdijk的建议进行增强:export LS_COLORS="$LS_COLORS:mh=44;37" - Abdull

根据gertvdijk的回答,我想出了以下代码片段,非常适合我的需求:
if [[ -e "/etc/debian_version" ]] && type dircolors > /dev/null 2>&1; then
    command dircolors|command grep -q 'hl=' && export LS_COLORS="ln=01;36:hl=00;36"
    command dircolors|command grep -q 'mh=' && export LS_COLORS="ln=01;36:mh=00;36"
fi

编辑:实际上,我不得不重写这段代码片段(请参见编辑历史)。
原来,当使用管道时,ls命令会“吞掉”有关LS_COLORS的错误输出。至少我无法使用grep命令找到它,无论是使用2>&1还是不使用。因此需要进行一些更改。我们检查dircolors命令是否可用。如果可用,它应该输出一段包含各种已识别文件类型的默认值的shell代码片段(默认情况下与Bourne shell兼容)。因此,我们在dircolors命令的输出中检查是否存在hl=或mh=。通过这种方式,我们可以确定ls命令所期望的是哪个,并相应地导出LS_COLORS变量。为了排除文件扩展名以hl或mh结尾且符合我们条件的可能性,最好使用grep命令分别搜索:hl=和:mh=。
上述颜色表示软链接为浅青色(light cyan),默认黑色为硬链接的深青色(darker cyan)。
你当然可以根据需要调整顶层条件。目前我只在Debian/Ubuntu上进行设置,因为暂时没有时间在旧的RHEL/CentOS系统上进行测试。
注意:通过command来调用是为了避免与我们尝试使用的工具具有相同名称的别名/函数产生冲突。

dircolors 是配置这个的方式,没错! :) - gertvdijk