ls - цвет: как окрасить исполняемые жесткие ссылки?

Ваша проблема должна быть лучше определена, но рассмотрение Вашего демонстрационного входа, я высказываю предположение относительно того, что Вы хотите сделать. Используйте маленький сценарий AWK как это:

#!/bin/bash

awk '! /START-OF-/ {
  if (MODE=="DEFINE") { HEADER=HEADER $0 "|" }
  else if ((MODE=="DATA") && (NF>0)) { print }
}
 /START-OF-FIELDS/ { MODE="DEFINE"; HEADER="" }
 /START-OF-DATA/ {
      print HEADER
      MODE="DATA"
      HEADER=""
     }' | sed 's/|$//'

Это производит:

ID|NAME|DEPT
1|joy|cs
2|sam|ec
ID |NAME|DOB|DEPT|ADDRESS
5|joe|13/2/2001/|ee|street1
3|gwen|4/08/1999|cs|street2

Примечание: Я ленив, таким образом, я добавляю вертикальную панель после каждого поля в заголовке. Затем я использую команду SED для удаления запаздывающих V-панелей впоследствии.

6
04.04.2014, 19:07
3 ответа
[1125577]Ну, после просмотра исходных текстов, мне пришлось идти до конца. :)
  • В настоящее время нет способа раскрашивать жестко связанные исполняемые файлы иначе, чем не жестко связанные исполняемые файлы, кроме создания пользовательской версии [1126031]ls[1126032].
  • Вот как я сделал это на Ubuntu 10.04.4 (Проблема также существует на Ubuntu 13.10, но я не был на этом, когда я сделал это. Должно быть очень похоже):
  • Модифицированный src/ls.c следующим образом:
  • Затем скомпилируйте все:
  • Эта команда заканчивается ошибкой, но она действительно компилирует новый [1126033]ls[1126034] в [1126035]src/ls[1126036], который работает так, как нужно. :)
  • Альтернативные решения:
  • Создайте ls-эквивалентный скрипт, используя bash или python.

    Некоторые псевдонимы, которые я уже использовал ранее для поиска жестких ссылок:

    псевдонимы findHardLinkedFiles_SortByInode='find . -тип f -ссылок +1 -printf "inode=%i %s=размер ссылок=%n file=%p \n". | сортировать -n'

    псевдоним findHardLinkedFiles_SortBySize='find . -тип f -ссылок +1 -printf "%s=размер ссылок=%n inode=%i file=%p \n". | сортировка -n'

    Как раскрасить вывод терминала:

    https://stackoverflow.com/questions/2616906/how-do-i-output-coloured-text-to-a-linux-terminal

    https://stackoverflow.com/questions/287871/print-in-terminal-with-colors-using-python

    3
    27.01.2020, 20:27

    Основываясь на ответе 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":

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

    Установка цвета по умолчанию:

        static struct bin_str color_indicator[] =
          {
            { LEN_STR_PAIR ("\033[") },     /* 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 ("\033[K") },    /* cl: clear to end of line */
          };
    

    Вы можете установить свои собственные цвета либо выше, либо в вашем скрипте .bashrc, как это:

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

    см: Что означают разные цвета в терминале?

    Установите правило приоритета:

            {
              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;
            }
    

    Затем скомпилируйте: (команда должна быть запущена от имени пользователя, не 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
    27.01.2020, 20:27

    Лично я считаю, что раскраска жестких ссылок в первую очередь произвольна. Я считаю, что лучше выделить количество ссылок в длинном списке, когда оно> = 2. Вы можете увидеть это в моем сценарии-оболочке ls по адресу:

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

    1
    27.01.2020, 20:27

    Теги

    Похожие вопросы