이를 위해 사용할 수 있습니다 $LS_COLORS
. 해당 버전을 ls
사용하여 해당 변수를 사용하여 색상 지정 을 지원하는 경우 파일 유형별로 출력을 정의 할 수 있습니다. 기본 동작이며 매우 구성 가능합니다. 그래서 다음과 같이 데모 할 파일을 만들었습니다.
for f in 9 8 7 6 5 4 3 2 1
do touch "${f}file" &&
ln -s ./"${f}file" ./"${f}filelink"
done
이제 할게요 :
LS_COLORS='lc=:rc=:ec=:ln=\n\n\0HERE_THERE_BE_A_LINK>>\0:' \
ls -1 --color=always | cat
###OUTPUT###
1file
HERE_THERE_BE_A_LINK>>1filelink@
2file
HERE_THERE_BE_A_LINK>>2filelink@
3file
...
HERE_THERE_BE_A_LINK>>8filelink@
9file
...
그리고 null도 있습니다 ...
LS_COLORS='lc=:rc=:ec=:ln=\n\n\0HERE_THERE_BE_A_LINK>>\0:' \
ls -1 --color=always | sed -n l
1file$
$
$
\000HERE_THERE_BE_A_LINK>>\0001filelink@$
2file$
$
$
\000HERE_THERE_BE_A_LINK>>\0002filelink@$
3file$
...
모든 또는 모든 파일 형식을 지정할 수 있습니다. ls
터미널 이스케이프에 대한 기본 컴파일 값이 일부 포함되어 있기 때문에 단일 파일 유형에 대해서만 그렇게하는 것은 원하지 않을 수 있습니다 . API를 단일 인터페이스로 처리하는 것이 훨씬 낫습니다. 현재 환경 dircolors
구성 기본값 을 구문 분석하고 할당하는 간단한 방법은 다음과 같습니다 .
LS_COLORS='rs=:no=//:lc=:rc=:ec=//:'$(
set -- di fi ln mh pi so do bd cd or su sg ca tw ow st ex
for fc do printf %s "$fc=/$fc//:"
done) ls -l --color=always | cat
내 홈 디렉토리의 출력은 다음과 같습니다.
total 884
///-rw-r--r-- 1 mikeserv mikeserv 793 Jul 9 11:23 /fi//1/
//drwxr-xr-x 1 mikeserv mikeserv 574 Jun 24 16:50 /di//Desktop//
//-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 /fi//Terminology.log/
//-rw-r--r-- 1 mikeserv mikeserv 0 Jul 6 11:24 /fi//new
file/
//lrwxrwxrwx 1 mikeserv mikeserv 10 Jul 11 04:18 /ln//new
file
link/ -> /fi//./new
file/
//-rwxr-xr-x 1 mikeserv mikeserv 190 Jun 22 11:26 /ex//script.sh/*
//-rw-r--r-- 1 mikeserv mikeserv 433568 Jun 22 17:10 /fi//shot-2014-06-22_17-10-16.jpg/
//-rw-r--r-- 1 mikeserv mikeserv 68 Jun 17 19:59 /fi//target.txt/
당신도 그것을 실행할 수 있으며 cat -A
당신이 보게 될 유일한 차이점은 줄 $
바꿈 을 볼 수 있다는 것 입니다- ls --color=always
이 구성으로 소개 할 수없는 문자가 없습니다 -여기에 보이는 것만 있습니다.
ls
다음과 같이 기본 터미널 이스케이프를 삽입합니다.
${lc}${type_code}${rc}FILENAME${lc}${rs}${rc}
... $lc
(왼쪽 코드) , $rc
(오른쪽 코드) 및 $rs
(재설정) 의 기본값 은 다음과 같습니다.
\033 - ESCAPE
m - END ESCAPE
0 - reset
...각기. ${type_code}
다양한 fi
(일반 파일-기본 설정 해제) , di
(디렉토리) , ln
(링크) 및 내가 알고있는 다른 모든 파일 형식을 나타내는 데 사용됩니다. 도 있습니다 $no
(정상) 기본적으로도 해제하고있는 여기에 의해 표현되는 //
각 행의 시작 부분은. 내 간단한 작은 IFS=:
블록은 구성 가능한 각 이름을 자체 값으로 삽입하고 슬래시 또는 2를 추가하여 작동하지만 \0
NUL 바이트도 마찬가지입니다.
기본적 으로 첫 번째 출력 바로 앞에 ls
하나를 삽입 $rs
합니다$lc
하지만 여기에 정확하게 표시되지는 않습니다. 이 경우 내가 지정한 $ec
(종료 코드) 에 대한에 서 $rs
모든 경우에 -이 지정되어있을 때 추가하지 않는 $rs
사이 $no
와 ${type_code}
그것을 유일한 선물은 바로 파일 이름을 다음 - 당신이 다른 것 같은 과 출력의 시작에 한 번을 -1 행에서 한 번의 추가 슬래시에서 볼 수 있듯이.
여기 내 스 니펫이 있습니다. $LS_COLORS
printf %s "$LS_COLORS"
rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:\
so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:\
or=40;31;01:su=37;41:sg=30;43:ca=30;41:\
tw=30;42:ow=34;42:st=37;44:ex=01;32:\
*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:...
사실, 내 작은 쉘 핵은 지나치게 복잡 할 수 있습니다. 이러한 값을 할당하기 위해 광범위하게 사용 가능한 인터페이스가 있습니다. dircolors -p
당신의 진료소에서 시도 하고info dircolors
자세한 정보를 확인하십시오.
파일 이름을 임의의 문자열로 줄 바꿈 할 수 있습니다. 원하는 경우 의견을 제시 할 수 있습니다. 파일 확장자만으로 유사한 동작을 지정할 수 있습니다. 그렇게 지정할 수없는 것은 많지 않습니다.
이제 나는이 모든 것을 만들어내는 것이 아니라 소스 코드를 우연히 만난 후에 그것에 대해 배웠습니다. . 우연히 를 우연히 .
이 특정 구성으로 ls
을 방출합니다.
$no
-각 레코드 시작시 레코드 당 한 번
${type_code}
- 한 번에 바로 파일의 형식의 약어를 포함하는 각 파일 이름을 이전과 이후 필드를 구분 공백으로 7 항상 같은 라인에서 발생 $no
또는 즉시 다음->
있으며 심볼릭 링크의 대상을 나타내는 나타 .
$ec
-첫 번째 줄 바로 앞에 한 번, 그 후에 각 파일 이름 바로 뒤에 한 번만.
다른 모든 값은 비어 있습니다.
다음은 null-delimited ls
이며 이번에는을 사용 cat -A
하지만 마지막 예제와 동일 하게 사용할 것입니다.
LS_COLORS='rs=:no=\0//:lc=:rc=:ec=\0//:'$(
set -- di fi ln mh pi so do bd cd or su sg ca tw ow st ex
for fc do printf %s "$fc=/$fc//\0:"
done) ls -l --color=always | cat -A
total 884$
^@//^@//-rw-r--r-- 1 mikeserv mikeserv 793 Jul 9 11:23 /fi//^@1^@//$
^@//drwxr-xr-x 1 mikeserv mikeserv 574 Jun 24 16:50 /di//^@Desktop^@///$
^@//-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 /fi//^@Terminology.log^@//$
^@//-rw-r--r-- 1 mikeserv mikeserv 0 Jul 6 11:24 /fi//^@new$
file^@//$
^@//lrwxrwxrwx 1 mikeserv mikeserv 10 Jul 11 04:18 /ln//^@new$
file$
link^@// -> /fi//^@./new$
file^@//$
^@//-rwxr-xr-x 1 mikeserv mikeserv 190 Jun 22 11:26 /ex//^@script.sh^@//*$
^@//-rw-r--r-- 1 mikeserv mikeserv 433568 Jun 22 17:10 /fi//^@shot-2014-06-22_17-10-16.jpg^@//$
^@//-rw-r--r-- 1 mikeserv mikeserv 68 Jun 17 19:59 /fi//^@target.txt^@//$
따라서 이와 같은 전체 목록 에서 모든 심볼릭 링크 를 안정적으로 제거 -l
하려면 간단한 변경을 수행 할 수 있습니다.
LS_COLORS='rs=:no=//:lc=:rc=:ec=/ :'$(
set -- di fi mh pi so do bd cd or su sg ca tw ow st ex
for fc do printf %s "$fc=$fc/:"
done)ln=///: ls -l --color=always | sed ':ln
\|///|{N;\|\n//|!bln};s|.*//||'
실행 후 내 결과는 다음과 같습니다 ...
total 884
-rw-r--r-- 1 mikeserv mikeserv 793 Jul 9 11:23 fi/1/
drwxr-xr-x 1 mikeserv mikeserv 574 Jun 24 16:50 di/Desktop/ /
-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 fi/Terminology.log/
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 6 11:24 fi/new
file/
-rwxr-xr-x 1 mikeserv mikeserv 190 Jun 22 11:26 ex/script.sh/ *
-rw-r--r-- 1 mikeserv mikeserv 433568 Jun 22 17:10 fi/shot-2014-06-22_17-10-16.jpg/
-rw-r--r-- 1 mikeserv mikeserv 68 Jun 17 19:59 fi/target.txt/
위에서하는 것과 비슷한 명령을 사용합니다.
LSCOLORS=...$(...)fc1=///:fc2=///: ls ... | sed ...
... ( 서브 쉘에서 뒤에 나열된 파일 유형 fc1
및 위치 )fc2
set --
은 ls
파일 이름에 포함될 수있는 문자에 관계없이 출력 에서 원하는 파일 유형 조합을 안정적으로 제거하는 역할을 합니다.