Możesz użyć $LS_COLORS
do tego. Jeśli twoja wersja ls
obsługuje określanie kolorów za pomocą tej zmiennej, możesz zdefiniować dane wyjściowe według typu pliku. Jest to wbudowane zachowanie i bardzo konfigurowalne. Więc stworzyłem kilka plików do pokazania:
for f in 9 8 7 6 5 4 3 2 1
do touch "${f}file" &&
ln -s ./"${f}file" ./"${f}filelink"
done
Więc teraz zrobię:
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
...
A nulls też tam są ...
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$
...
Możesz określić dla wszystkich lub dowolnych typów plików. Robi to tylko w przypadku pojedynczego typu pliku, ale nie jest to pożądane, ponieważ ls
wprowadzono pewne domyślne wartości kompilacji dla ucieczek terminali. O wiele lepiej byłoby zająć się interfejsem API jako pojedynczym interfejsem. Oto prosty mały sposób analizowania i przypisywania wartości dircolors
domyślnych skonfigurowanych w bieżącym środowisku :
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
Jego wynik w moim katalogu domowym wygląda następująco:
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/
Możesz to również uruchomić, cat -A
a jedyną różnicą, jaką możesz napotkać, jest to, że zobaczysz $
nowe wiersze - nie ma znaków, które nie można wydrukować, wprowadzonych przezls --color=always
w tej konfiguracji - tylko to, co widzisz tutaj.
ls
wstawia domyślny znak ucieczki terminala w ten sposób:
${lc}${type_code}${rc}FILENAME${lc}${rs}${rc}
... gdzie wartości domyślne $lc
(po lewej stronie kodu) , $rc
(po prawej stronie kodu) i $rs
(reset) to:
\033 - ESCAPE
m - END ESCAPE
0 - reset
...odpowiednio. ${type_code}
służy do zastępowania różnych fi
(zwykły plik - domyślnie nieuzbrojony) , di
(katalog) , ln
(link) i każdego innego typu pliku, jaki znam. Istnieje również $no
(normalny), który jest domyślnie nieuzbrojony i który jest tutaj reprezentowany przez //
na początku każdej linii. Mój prosty mały IFS=:
blok działa po prostu przez wstawienie nazwy dla każdego konfigurowalnego jako własnej wartości i dodanie ukośnika lub dwóch - chociaż \0
NUL bajtów też by to zrobiło.
Domyślnie ls
wstawi również jedno $rs
bezpośrednio poprzedzające jego pierwsze wyjście $lc
- ale nie jest to tutaj dokładnie przedstawione. W tym przypadku podałem $ec
(kod końcowy), który jest oznaczony$rs
we wszystkich przypadkach - gdy jest określony, nie dostaniesz dodatkowego $rs
pomiędzy, $no
a ${type_code}
tak jak by to było inaczej - przedstawia tylko bezpośrednio po nazwie pliku i raz na początku wyjścia - jak widać w jednym dodatkowym ukośniku na początku pierwszej linii.
Oto fragment mojego własnego $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:...
I prawdę mówiąc, mój mały hack z powłoki jest prawdopodobnie zbyt skomplikowany - istnieje powszechnie dostępny interfejs do przypisywania tych wartości. Spróbuj dircolors -p
w swoim cli i info dircolors
uzyskać więcej informacji na ten temat.
Możesz zawijać nazwy plików w dowolne ciągi. Możesz je skomentować, jeśli chcesz. Możesz określić podobne zachowania na podstawie tylko rozszerzenia pliku. Tak naprawdę nie ma tak wielu rzeczy, których nie można określić.
Teraz nie tylko wymyślam to wszystko - dowiedziałem się o tym po przypadkowym natknięciu się na kod źródłowy .
Dzięki tej konkretnej konfiguracji ls
wyemituje:
$no
- raz na rekord na początku każdego rekordu
${type_code}
- jednokrotnie bezpośrednio poprzedzający każdą nazwę pliku, zawierającą skrót typu pliku i zawsze występujący w tym samym wierszu i 7 polach oddzielonych spacjami po $no
lub bezpośrednio po ->
oznaczeniu celu dowiązania symbolicznego.
$ec
- raz bezpośrednio przed pierwszym wierszem, a następnie tylko raz bezpośrednio po każdej nazwie pliku.
Wszystkie pozostałe wartości są puste.
To, co następuje, jest rozdzielone znakiem null ls
, i tym razem skorzystam cat -A
, ale bez niego wyglądałoby to tak samo jak w poprzednim przykładzie:
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^@//$
Aby więc niezawodnie usunąć wszystkie dowiązania symboliczne z -l
listy ong, takiej jak ta, możesz wprowadzić prostą zmianę:
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|.*//||'
Moje wyniki po uruchomieniu wyglądają jak ...
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/
Za pomocą polecenia podobnego do powyższego:
LSCOLORS=...$(...)fc1=///:fc2=///: ls ... | sed ...
... (gdzie fc1
i gdzie fc2
typy plików są wymienione set --
w dalszej części podpowłoki) powinny służyć do niezawodnego usuwania dowolnych kombinacji typów plików, które mogą być potrzebne, ls
bez względu na znaki, które nazwy plików mogą zawierać.