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 래퍼 스크립트에서 이를 볼 수 있습니다.