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

뭐, 소스코드를 보니 쭉 갈 수밖에 없었습니다. :)

현재 사용자 정의 버전을 생성하는 것 외에는 하드 링크되지 않은 실행 파일과 다르게 하드 링크된 실행 파일의 색상을 지정할 수 있는 방법이 없습니다.엘에스.

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

명령이 오류로 끝나지만 새 명령을 컴파일합니다.엘에스존재하다소스/ls, 예상대로 작동합니다. :)

대체 솔루션:

  • Bash 또는 Python을 사용하여 ls와 동일한 스크립트를 만듭니다.
  • 이전에 하드 링크를 찾기 위해 몇 가지 별칭을 사용했습니다.

    별칭 findHardLinkedFiles_SortByInode='find. -type f -links +1 -printf "inode=%i %s=크기 nlinks=%n 파일=%p \n" |sort-n'

    별칭 findHardLinkedFiles_SortBySize='find. -type f -links +1 -printf "%s=크기 nlinks=%n inode=%i 파일=%p \n" |sort-n'

터미널 출력 색상 지정 방법:

답변2

KIAaze 답변을 바탕으로 사용자 정의 수정 사항을 생각해 냈습니다. (coreutils 8.21을 사용하여 Ubuntu 14.04에서 수행됨)

설치: (변경사항 없음) -- deb-src 저장소를 활성화했는지 확인하세요 --

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

("build-dep coreutils" 명령 중에 어떤 패키지가 설치되었는지 기록해 두세요. 마지막에 정리하려면 해당 패키지가 필요합니다.)

코드 수정:(패치는 여기에서 찾을 수 있습니다.)

추가됨: "C_EXEC_HARDLINK" 및 "em":

    열거형 표시_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
      };

    정적 const char *const 표시_이름[]=
      {
        "lc", "rc", "ec", "rs", "no", "fi", "di", "ln", "pi", "so",
        "bd", "cd", "mi", "or", "ex", "do", "su", "sg", "st",
        "아야", "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") }, /* 예: 실행 파일: 밝은 녹색*/
        { 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 ((pattern& S_ISUID) != 0 && is_color (C_SETUID))
            유형=C_SETUID;
          그렇지 않은 경우 ((mode & S_ISGID) != 0 && is_color (C_SETGID))
            유형=C_SETGID;
          else if (is_color (C_CAP) && f->has_capability)
            유형=C_CAP;
          그렇지 않은 경우 ((1 stat.st_nlink) && (mode & S_IXUGO) != 0 && is_color (C_EXEC_HARDLINK))
            유형 = C_EXEC_HARDLINK;
          그렇지 않은 경우 ((mode & S_IXUGO) != 0 && is_color (C_EXEC))
            유형=C_EXEC;
          else if ((1 stat.st_nlink) && is_color (C_MULTIHARDLINK))
            유형 = C_MULTIHARDLINK;
        }

그런 다음 컴파일하십시오. (명령은 루트가 아닌 사용자로 실행되어야 합니다.)

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

관련 정보