Puoi usare $LS_COLORS
per fare questo. Se la tua versione di ls
supporta la specifica dei colori usando quella variabile, puoi definire l'output per tipo di file. È un comportamento integrato e molto configurabile. Quindi ho creato alcuni file per dimostrarlo come questo:
for f in 9 8 7 6 5 4 3 2 1
do touch "${f}file" &&
ln -s ./"${f}file" ./"${f}filelink"
done
Quindi ora farò:
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
...
E ci sono anche i 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$
...
È possibile specificare per tutti o tutti i tipi di file. Farlo solo per un singolo tipo di file potrebbe non farti desiderare, dato che ls
ha incorporato alcuni valori di compilazione predefiniti per le escape di terminale. Faresti molto meglio ad affrontare l'API come un'unica interfaccia. Ecco un piccolo e semplice mezzo per analizzare e assegnare le dircolors
impostazioni predefinite dell'ambiente corrente :
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
Il suo output nella mia directory home è simile al seguente:
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/
Puoi eseguirlo cat -A
anche con e l'unica differenza che incontrerai è che vedrai $
per le nuove righe - non ci sono caratteri non stampabili introdotti da ls --color=always
questa configurazione - solo ciò che vedi qui.
ls
inserisce i suoi escape di terminale predefiniti in questo modo:
${lc}${type_code}${rc}FILENAME${lc}${rs}${rc}
... dove i valori predefiniti per $lc
(a sinistra del codice) , $rc
(a destra del codice) e $rs
(ripristina) sono:
\033 - ESCAPE
m - END ESCAPE
0 - reset
...rispettivamente. ${type_code}
viene utilizzato per sostituire i vari fi
(file normale - impostazione predefinita non impostata) , di
(directory) , ln
(collegamento) e ogni altro tipo di file che conosco. C'è anche $no
(normale) che è anche di default non impostato e che è qui rappresentato //
all'inizio di ogni riga. Il mio semplice piccolo IFS=:
blocco funziona semplicemente inserendo il nome di ogni configurabile anche come suo valore e aggiungendo una barra o due - sebbene anche i \0
byte NUL lo farebbero.
Di default ls
inserirà anche uno che $rs
precede immediatamente il suo primo output $lc
, ma qui non è rappresentato con precisione. In questo caso ho specificato $ec
(codice finale) che sostituisce in $rs
tutti i casi - quando viene specificato non si ottiene un extra $rs
tra $no
e ${type_code}
come si farebbe altrimenti - si presenta solo immediatamente dopo un nome file e una volta all'inizio dell'output - come puoi vedere nell'ultima barra in testa alla prima riga.
Ecco un frammento del mio $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:...
E, in verità, il mio piccolo hack shell è probabilmente eccessivamente complicato - c'è un'interfaccia ampiamente disponibile per assegnare questi valori. Prova dircolors -p
nel tuo cli e info dircolors
per ulteriori informazioni al riguardo.
Puoi racchiudere i nomi dei file in stringhe arbitrarie. Puoi commentarli se lo desideri. È possibile specificare comportamenti simili basati solo sull'estensione del file. Non c'è davvero molto che non puoi specificare in questo modo.
Ora non sto solo inventando tutto questo - l'ho imparato dopo aver inciampato su codice sorgente .
Con questa particolare configurazione ls
emetterà:
$no
- una volta per record all'inizio di ogni record
${type_code}
- una volta immediatamente precedente a ciascun nome file per includere un'abbreviazione del tipo di file e che si verificano sempre sulla stessa riga di e 7 campi delimitati da spazi bianchi dopo $no
o immediatamente dopo una ->
denotazione del target di un collegamento simbolico.
$ec
- una volta che precede immediatamente la prima riga e successivamente solo una volta immediatamente dopo ogni nome di file.
Tutti gli altri valori sono vuoti.
Quello che segue è delimitato da null ls
, e questa volta userò cat -A
, anche se, senza di esso, sembrerebbe lo stesso dell'ultimo esempio:
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^@//$
Quindi, per rimuovere in modo affidabile tutti i collegamenti simbolici da un -l
elenco ong come questo, è possibile apportare una semplice modifica:
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|.*//||'
I miei risultati dopo aver eseguito sembrano come ...
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/
Usando un comando simile a quello che faccio sopra:
LSCOLORS=...$(...)fc1=///:fc2=///: ls ... | sed ...
... (dove fc1
e fc2
sono i tipi di file elencati di seguito set --
nella sottostruttura) dovrebbero servire a rimuovere in modo affidabile qualsiasi combinazione di tipi di file che si potrebbe desiderare ls
dall'output indipendentemente da qualsiasi carattere che i nomi dei file potrebbero contenere.