我在 NTFS 驱动器上创建了一些硬链接,但正因如此,它们都是可执行的,并且颜色为可执行而不是硬链接(具有多个链接的常规文件)。
我在我的 ext4 驱动器上做了一个测试,它是同样的问题:使用 ls --color 时,任何具有多个链接的文件都会很好地突出显示,但是一旦它有一个可执行位,它就会得到“可执行”着色(粗体)默认情况下,不突出显示)。
我尝试了各种 LS_COLOR 设置,但没有改变。
我当前的 ~/.dir_colors 文件简化为:
RESET 0
HARDLINK 44;37
#EXEC 01;32;41
Run Code Online (Sandbox Code Playgroud)
我用这个测试它:
eval "$(dircolors ~/.dir_colors)"; ls -l --color
Run Code Online (Sandbox Code Playgroud)
该文件似乎可用于更改颜色、突出显示等,但我无法根据 HARDLINK 设置对可执行硬链接进行着色。
更新:经过一些研究,似乎“exe 着色优先”。看起来它被硬编码到 ls 本身中:
所以唯一的解决方案是定制的“ls”,对吗?
好吧,看了源码之后,我只好一路走下去。:)
除了创建ls的自定义版本之外,目前没有其他方法可以对硬链接可执行文件进行与非硬链接可执行文件不同的着色。
这是我在 Ubuntu 10.04.4 上的做法(这个问题也存在于 Ubuntu 13.10 上,但我做的时候并没有这样做。不过应该非常相似):
sudo apt-get build-dep coreutils
apt-get source coreutils
cd coreutils-7.4
Run Code Online (Sandbox Code Playgroud)
修改src/ls.c如下:
$ diff coreutils-7.4/src/ls.c coreutils-7.4.custom/src/ls.c
4107,4108c4107,4108
< else if ((mode & S_IXUGO) != 0)
< type = C_EXEC;
---
> // else if ((mode & S_IXUGO) != 0)
> // type = C_EXEC;
Run Code Online (Sandbox Code Playgroud)
然后编译一切:
debuild -us -uc -b
Run Code Online (Sandbox Code Playgroud)
该命令以错误结束,但它确实在src/ls中编译了一个新的ls,它按预期工作。:)
替代解决方案:
我之前已经使用过一些别名来定位硬链接:
别名 findHardLinkedFiles_SortByInode='find 。-type f -links +1 -printf "inode=%i %s=size nlinks=%n file=%p \n" | 排序-n'
别名 findHardLinkedFiles_SortBySize='find 。-type f -links +1 -printf "%s=size nlinks=%n inode=%i file=%p \n" | 排序-n'
如何为终端输出着色: