您可以$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
...
空值也在那里...
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=:
仅通过将每个可配置的名称插入其自身值并添加一个或两个斜杠的方式工作,尽管\0
NUL字节也可以。
默认情况下,ls
还将$rs
在第一个输出之前插入一个$lc
-但这在此处未正确表示。在这种情况下,我已指定$ec
(结束代码),其代表为$rs
在所有情况下-被指定当你没有得到额外的$rs
之间$no
并${type_code}
为您否则会-它只是呈现立即文件名以下,并在输出开始一次-正如您在第一行顶部的一个斜杠中看到的那样。
这是我自己的摘录 $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:...
而且,实际上,我的小shell破解可能过于复杂-有一个广泛使用的接口可以分配这些值。尝试dircolors -p
在您的CLI中info dircolors
获取更多信息。
您可以将文件名包装在任意字符串中。您可以根据需要将其注释掉。您可以仅基于文件扩展名指定类似的行为。确实没有太多您无法指定这种方式。
现在,我不仅要解决所有这些问题,还因为偶然偶然涉足了源代码而了解了这一点。
使用此特定配置ls
将发出:
$no
-在每个记录的开头每个记录一次
${type_code}
-在每个文件名之前紧随其后,以包含文件类型的缩写,并且始终在与7个以空格分隔的字段相同的行上出现,该字段在表示符号链接的目标之后$no
或之后->
。
$ec
-一次紧接在第一行之后,之后仅一次紧随每个文件名之后。
所有其他值均为空。
接下来是一个以null分隔的内容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^@//$
因此,要可靠地从这样的ong列表中删除所有符号链接-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
输出中删除您可能想要的文件类型的任何组合,而不考虑文件名可能包含的任何字符。