ls --color: como colorir links duráveis executáveis?

6

Eu criei alguns hardlinks em uma unidade NTFS, mas por causa disso, eles são todos executáveis e coloridos como executáveis, em vez de como hardlinks (arquivo regular com mais de um link).

Eu fiz um teste na minha unidade ext4 e é o mesmo problema: Qualquer arquivo com mais de um link fica bem destacado ao usar ls --color, mas assim que ele tem um bit executável, ele obtém a coloração "executável" (negrito por padrão, sem destaque).

Eu tentei várias configurações de LS_COLOR, mas nenhuma alteração.

Meu arquivo atual ~ / .dir_colors é simplificado para isso:

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

E eu testo com isso:

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

O arquivo parece funcionar para alterar as cores, destacar, etc, mas não consigo que os hardlinks executáveis sejam coloridos de acordo com a configuração HARDLINK.

Atualização: Depois de algumas pesquisas, parece que "coloração exe tem precedência". Parece que é codificado em si próprio:

Assim, a única solução seria um "ls" personalizado, correto?

    
por KIAaze 04.04.2014 / 16:37

3 respostas

3

Bem, depois de olhar para a fonte, eu tive que ir até o fim. :)

Atualmente, não há como colorir os executáveis com link físico de maneira diferente dos executáveis sem hardlink, além de criar uma versão personalizada de ls .

Veja como eu fiz isso no Ubuntu 10.04.4 (O problema também existe no Ubuntu 13.10, mas eu não estava nisso quando o fiz. Deve ser bem parecido):

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

src / ls.c modificado da seguinte forma:

$ 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;

Depois compile tudo:

debuild -us -uc -b

Este comando termina com um erro, mas compila um novo ls em src / ls , que funciona como desejado. :)

Soluções alternativas:

  • Crie um script equivalente a ls usando bash ou python.
  • Alguns aliases que eu já estava usando antes para localizar links físicos:

    alias findHardLinkedFiles_SortByInode = 'localizar. -type f -links +1-printf "inode =% i% s = tamanho nlinks =% n arquivo =% p \ n" | sort -n '

    alias findHardLinkedFiles_SortBySize = 'localizar. -tipo f -links +1-printf "% s = tamanho nlinks =% n inode =% i arquivo =% p \ n" | sort -n '

Como colorir a saída do terminal:

por 07.04.2014 / 11:02
3

Com base na resposta do KIAaze, criei minha modificação personalizada: (Feito no Ubuntu 14.04 com coreutils 8.21)

Instale: (sem alteração) - certifique-se de ter os repositórios deb-src habilitados -

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

(Mantenha uma nota sobre quais pacotes foram instalados durante o comando "build-dep coreutils", você precisará deles para limpar no final).

Modificações no código: ( patch disponível aqui )

Adicionado: "C_EXEC_HARDLINK" e "em":

    enum 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", "no", "fi", "di", "ln", "pi", "so",
        "bd", "cd", "mi", "or", "ex", "do", "su", "sg", "st",
        "ow", "tw", "ca", "mh", "em", "cl", NULL
      };

Definir cor padrão:

    static struct bin_str color_indicator[] =
      {
        { LEN_STR_PAIR ("3[") },     /* lc: Left of color sequence */
        { LEN_STR_PAIR ("m") },     /* rc: Right of color sequence */
        { 0, NULL },            /* ec: End color (replaces lc+no+rc) */
        { LEN_STR_PAIR ("0") },     /* rs: Reset to ordinary colors */
        { 0, NULL },            /* no: Normal */
        { 0, NULL },            /* fi: File: default */
        { LEN_STR_PAIR ("01;34") },     /* di: Directory: bright blue */
        { LEN_STR_PAIR ("01;36") },     /* ln: Symlink: bright cyan */
        { LEN_STR_PAIR ("33") },        /* pi: Pipe: yellow/brown */
        { LEN_STR_PAIR ("01;35") },     /* so: Socket: bright magenta */
        { LEN_STR_PAIR ("01;33") },     /* bd: Block device: bright yellow */
        { LEN_STR_PAIR ("01;33") },     /* cd: Char device: bright yellow */
        { 0, NULL },            /* mi: Missing file: undefined */
        { 0, NULL },            /* or: Orphaned symlink: undefined */
        { LEN_STR_PAIR ("01;32") },     /* ex: Executable: bright green */
        { LEN_STR_PAIR ("01;35") },     /* do: Door: bright magenta */
        { LEN_STR_PAIR ("37;41") },     /* su: setuid: white on red */
        { LEN_STR_PAIR ("30;43") },     /* sg: setgid: black on yellow */
        { LEN_STR_PAIR ("37;44") },     /* st: sticky: black on blue */
        { LEN_STR_PAIR ("34;42") },     /* ow: other-writable: blue on green */
        { LEN_STR_PAIR ("30;42") },     /* tw: ow w/ sticky: black on green */
        { LEN_STR_PAIR ("30;41") },     /* ca: black on red */
        { 0, NULL },     /* mh: HardLink: disabled by default */
        { 0, NULL },  /* em: Executable HardLink: disabled by default */
        { LEN_STR_PAIR ("3[K") },    /* cl: clear to end of line */
      };

Você pode definir suas cores personalizadas acima ou no seu script .bashrc da seguinte forma:

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

veja: O que significam as diferentes cores no terminal?

Defina a regra de prioridade:

        {
          type = C_FILE;

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

Em seguida, compile: (o comando deve ser executado como usuário, não raiz)

debuild -us -uc -b

Você pode executar o comando acima várias vezes, pois ele limpará a compilação de cada vez (no caso de você querer fazer suas próprias personalizações).

(como afirmado pelo KIAaze, ele pode retornar um erro no final relacionado a um teste, mas o comando "ls" funciona bem).

Por fim, substituímos "ls":

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

Limpar :

cd ..
rm -rf coreutils*
sudo apt-get remove <list of packages installed by 'build-dep coreutils'>
    
por 07.12.2015 / 03:45
1

Pessoalmente eu acho a cor dos hardlinks arbitrária em primeiro lugar. Acho melhor destacar a contagem de links na listagem longa quando for > = 2. Você pode ver isso no meu script wrapper ls em:

link

    
por 07.12.2015 / 11:29

Tags