Você pode usar $LS_COLORS
para fazer isso. Se a sua versão de ls
suportar a especificação das cores usando essa variável, você poderá definir a saída por tipo de arquivo. É um comportamento interno e muito configurável. Então eu criei alguns arquivos para demonstrar isso como:
for f in 9 8 7 6 5 4 3 2 1
do touch "${f}file" &&
ln -s ./"${f}file" ./"${f}filelink"
done
Então, agora eu farei:
LS_COLORS='lc=:rc=:ec=:ln=\n\nLS_COLORS='lc=:rc=:ec=:ln=\n\nLS_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
HERE_THERE_BE_A_LINK>>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/
:' \
ls -1 --color=always | sed -n l
1file$
$
$
${lc}${type_code}${rc}FILENAME${lc}${rs}${rc}
0HERE_THERE_BE_A_LINK>> 3 - ESCAPE
m - END ESCAPE
0 - reset
01filelink@$
2file$
$
$
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:...
0HERE_THERE_BE_A_LINK>>LS_COLORS='rs=:no=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|.*//||'
//:lc=:rc=:ec=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/
//:'$(
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//LSCOLORS=...$(...)fc1=///:fc2=///: ls ... | sed ...
:"
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^@//$
02filelink@$
3file$
...
HERE_THERE_BE_A_LINK>>for f in 9 8 7 6 5 4 3 2 1
do touch "${f}file" &&
ln -s ./"${f}file" ./"${f}filelink"
done
:' \
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
...
E os nulos também estão lá ...
LS_COLORS='lc=:rc=:ec=:ln=\n\nLS_COLORS='lc=:rc=:ec=:ln=\n\nLS_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
HERE_THERE_BE_A_LINK>>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/
:' \
ls -1 --color=always | sed -n l
1file$
$
$
${lc}${type_code}${rc}FILENAME${lc}${rs}${rc}
0HERE_THERE_BE_A_LINK>> 3 - ESCAPE
m - END ESCAPE
0 - reset
01filelink@$
2file$
$
$
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:...
0HERE_THERE_BE_A_LINK>>LS_COLORS='rs=:no=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|.*//||'
//:lc=:rc=:ec=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/
//:'$(
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//LSCOLORS=...$(...)fc1=///:fc2=///: ls ... | sed ...
:"
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^@//$
02filelink@$
3file$
...
HERE_THERE_BE_A_LINK>>%pre%:' \
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
...
Você pode especificar para todos ou quaisquer tipos de arquivos. Fazer isso apenas para um único tipo de arquivo pode não ser desejado, já que ls
incorporou alguns valores de compilação padrão para escapes de terminal. Você faria muito melhor para endereçar a API como uma interface única. Aqui está um pequeno meio simples de analisar e atribuir padrões atuais do dircolors
configurado:
%pre%
Sua saída em meu diretório inicial é assim:
%pre%
Você pode executar isso com cat -A
também e a única diferença que você encontrará é que você verá $
para novas linhas - não há caracteres não imprimíveis introduzidos por ls --color=always
com essa configuração - apenas o que você vê aqui.
ls
insere seus escapes de terminal padrão assim:
%pre%
... onde os valores padrão para $lc
(à esquerda do código) , $rc
(à direita do código) e $rs
(reset) são:
%pre%
... respectivamente. ${type_code}
é usado para substituir os vários fi
(arquivo normal - padrão não definido), , di
(diretório) , ln
( link) , e todos os outros tipos de arquivos que eu conheço. Há também $no
(normal) que também é por default unset e que é aqui representado por //
no início de cada linha. Meu simples bloco IFS=:
funciona apenas inserindo o nome para cada configurável como também seu próprio valor e adicionando uma barra ou dois - embora ls
NUL bytes também funcionem.
Por padrão, $rs
também inserirá um $lc
imediatamente antes de sua primeira saída $ec
- mas isso não é representado com precisão aqui. Neste caso, eu especifiquei $rs
(end code) que significa $rs
em todos os casos - quando é especificado, você não recebe um $no
extra entre ${type_code}
e $LS_COLORS
como você faria de outra forma - ele só é apresentado imediatamente após um nome de arquivo e uma vez no início da saída - como você pode ver na barra extra na primeira linha.
Aqui está um trecho do meu próprio dircolors -p
%pre%
E, na verdade, meu pequeno hack de shell é provavelmente muito complicado - há uma interface amplamente disponível para atribuir esses valores. Experimente info dircolors
em seu cli e ls
para mais informações sobre isso.
Você pode envolver os nomes dos arquivos em sequências arbitrárias. Você pode comentá-los, se desejar. Você pode especificar comportamentos semelhantes com base apenas na extensão do arquivo. Não há muita coisa que você não possa especificar dessa maneira.
Agora, eu não estou apenas inventando tudo isso - aprendi sobre isso depois de encontrar o código-fonte por acidente.
Com essa configuração específica, $no
será emitido:
-
${type_code}
- uma vez por registro no início de cada registro
-
$no
- uma vez precedendo cada nome de arquivo para incluir uma abreviação do tipo do arquivo e sempre ocorrendo na mesma linha e 7 campos delimitados por espaço em branco após ->
ou imediatamente após um $ec
denotando o destino de um link simbólico.
-
ls
- uma vez imediatamente antes da primeira linha e, posteriormente, apenas uma vez imediatamente após cada nome de arquivo.
-
Todos os outros valores estão vazios.
O que segue é um cat -A
delimitado por nulo e, desta vez, usarei -l
, mas sem ele pareceria o mesmo que o último exemplo:
%pre%
Assim, para remover com segurança os todos links simbólicos de uma listagem de fc1
ong como essa, você pode fazer uma alteração simples:
%pre%
Meus resultados depois de executados parecem ...
%pre%
Usando algum comando como o que eu faço acima:
%pre%
... (onde fc2
e set --
são tipos de arquivos listados após ls
no subshell) deve servir para remover com segurança quaisquer combinações de tipos de arquivos que você possa desejar de %code% output independentemente de qualquer caractere que os nomes de arquivos possam conter.