ls --color:如何为可执行硬链接着色?

ls --color:如何为可执行硬链接着色?

我在 NTFS 驱动器上创建了一些硬链接,但正因为如此,它们都是可执行的,并且着色为可执行文件,而不是硬链接(具有多个链接的常规文件)。

我在我的 ext4 驱动器上进行了一项测试,遇到了同样的问题:使用 ls --color 时,任何具有多个链接的文件都会很好地突出显示,但一旦它具有一个可执行位,它就会获得“可执行”着色(粗体)默认情况下,不突出显示)。

我尝试了各种 LS_COLOR 设置,但没有改变。

我当前的 ~/.dir_colors 文件简化为:

RESET 0
HARDLINK 44;37
#EXEC 01;32;41

我用这个测试它:

eval "$(dircolors ~/.dir_colors)"; ls -l --color

该文件似乎适用于更改颜色、突出显示等,但我无法根据 HARDLINK 设置为可执行硬链接着色。

更新:经过一些研究,似乎“exe 着色优先”。看起来它被硬编码到 ls 本身中:

所以唯一的解决方案是定制“ls”,对吗?

答案1

好吧,看了源码之后,我只好一路走下去。 :)

目前,除了创建自定义版本之外,没有其他方法可以对硬链接可执行文件进行与非硬链接可执行文件不同的着色。LS

这是我在 Ubuntu 10.04.4 上的做法(这个问题也存在于 Ubuntu 13.10 上,但我做的时候并没有这样做。不过应该非常相似):

sudo apt-get build-dep coreutils
apt-get source coreutils
cd coreutils-7.4

修改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;

然后编译一切:

debuild -us -uc -b

该命令以错误结束,但它确实编译了一个新的LSsrc/ls,它按预期工作。 :)

替代解决方案:

  • 使用 bash 或 python 创建与 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'

如何为终端输出着色:

答案2

基于 KIAaze 答案,我提出了自定义修改:(在 Ubuntu 14.04 中使用 coreutils 8.21 完成)

安装:(无变化)--确保你启用了 deb-src 存储库--

sudo apt-get build-dep coreutils
apt-get source coreutils
cd coreutils-8.21

(记下在“build-dep coreutils”命令期间安装了哪些软件包,您将需要它们在最后进行清理)。

代码修改:(补丁可以在这里找到

添加:“C_EXEC_HARDLINK”和“em”:

    枚举indicator_no
      {
        C_LEFT、C_RIGHT、C_END、C_RESET、C_NORM、C_FILE、C_DIR、C_LINK、
        C_FIFO、C_SOCK、
        C_BLK、C_CHR、C_MISSING、C_ORPHAN、C_EXEC、C_DOOR、C_SETUID、C_SETGID、
        C_STICKY、C_OTHER_WRITABLE、C_STICKY_OTHER_WRITABLE、C_CAP、
C_MULTIHARDLINK,C_EXEC_HARDLINK, C_CLR_TO_EOL
      };

    static const char *const Indicator_name[]=
      {
        “lc”、“rc”、“ec”、“rs”、“否”、“fi”、“di”、“ln”、“pi”、“so”、
        “bd”、“cd”、“mi”、“或”、“ex”、“do”、“su”、“sg”、“st”、
        “ow”、“tw”、“ca”、“mh”、“他们”,“cl”,空
      };

设置默认颜色:

    静态结构 bin_str color_indicator[] =
      {
        { LEN_STR_PAIR ("\033[") }, /* lc: 颜色序列左侧 */
        { LEN_STR_PAIR ("m") }, /* rc: 颜色序列右侧 */
        { 0, NULL }, /* ec: 结束颜色(替换 lc+no+rc) */
        { LEN_STR_PAIR ("0") }, /* rs: 重置为普通颜色 */
        { 0, NULL }, /*否:正常*/
        { 0, NULL }, /* fi: 文件:默认 */
        { LEN_STR_PAIR ("01;34") }, /* di: 目录:亮蓝色 */
        { LEN_STR_PAIR ("01;36") }, /* ln: 符号链接:亮青色 */
        { LEN_STR_PAIR ("33") }, /* pi: 管道: 黄色/棕色 */
        { LEN_STR_PAIR ("01;35") }, /* 所以:套接字:亮洋红色 */
        { LEN_STR_PAIR ("01;33") }, /* bd: 块设备:亮黄色 */
        { LEN_STR_PAIR ("01;33") }, /* cd: 字符设备:亮黄色 */
        { 0, NULL }, /* mi: 丢失文件: 未定义 */
        { 0, NULL }, /* 或: 孤立符号链接: 未定义 */
        { LEN_STR_PAIR ("01;32") }, /* ex: 可执行文件:亮绿色 */
        { LEN_STR_PAIR ("01;35") }, /* do: 门:亮洋红色 */
        { LEN_STR_PAIR ("37;41") }, /* su: setuid: 红底白字 */
        { LEN_STR_PAIR ("30;43") }, /* sg: setgid: 黄底黑字 */
        { LEN_STR_PAIR ("37;44") }, /* st: 粘性: 蓝底黑字 */
        { LEN_STR_PAIR ("34;42") }, /* ow: 其他可写:蓝底绿 */
        { LEN_STR_PAIR ("30;42") }, /* tw: ow w/sticky: 黑底绿 */
        { LEN_STR_PAIR ("30;41") }, /* ca: 红底黑字 */
        { 0, NULL }, /* mh: 硬链接:默认禁用 */
        { 0, NULL }, /* em: 可执行硬链接:默认禁用 */
        { LEN_STR_PAIR ("\033[K") }, /* cl: 清除到行尾 */
      };

您可以在上面或 .bashrc 脚本中设置自定义颜色,如下所示:

export LS_COLORS="ln=01;36:mh=01;36:em=01;33";

看:终端中的不同颜色意味着什么?

设置优先级规则:

        {
          类型=C_FILE;

          if ((模式 & S_ISUID) != 0 && is_colored (C_SETUID))
            类型=C_SETUID;
          否则 if ((mode & S_ISGID) != 0 && is_colored (C_SETGID))
            类型=C_SETGID;
          else if (is_colored (C_CAP) && f->has_capability)
            类型=C_CAP;
          否则 if ((1 stat.st_nlink) && (mode & S_IXUGO) != 0 && is_colored (C_EXEC_HARDLINK))
            类型 = C_EXEC_HARDLINK;
          否则 if ((mode & S_IXUGO) != 0 && is_colored (C_EXEC))
            类型=C_EXEC;
          else if ((1 stat.st_nlink) && is_colored (C_MULTIHARDLINK))
            类型 = C_MULTIHARDLINK;
        }

然后编译:(命令必须以用户身份运行,而不是root)

debuild -us -uc -b

您可以多次运行上述命令,因为它每次都会清理编译(如果您想进行自己的自定义)。

(正如 KIAaze 所说,它可能会在测试结束时返回一个与测试相关的错误,但“ls”命令可以正常工作)。

最后,我们替换“ls”:

sudo mv /bin/ls /bin/ls.orig
sudo mv src/ls /bin/ls

打扫干净:

cd ..
rm -rf coreutils*
sudo apt-get remove <list of packages installed by 'build-dep coreutils'>

答案3

就我个人而言,我发现硬链接的颜色首先是任意的。我发现当链接计数 >= 2 时,最好在长列表中突出显示链接计数。您可以在我的 ls 包装脚本中看到这一点:

http://www.pixelbeat.org/scripts/l

相关内容