Bunu $LS_COLORS
yapmak için kullanabilirsiniz . ls
Destek sürümünüz bu değişkeni kullanarak renkleri belirtmeyi destekliyorsa, dosya türü başına çıktı tanımlayabilirsiniz. Yerleşik davranışı ve çok yapılandırılabilir. Bu yüzden bu gibi demo için bazı dosyalar oluşturdum:
for f in 9 8 7 6 5 4 3 2 1
do touch "${f}file" &&
ln -s ./"${f}file" ./"${f}filelink"
done
Şimdi yapacağım:
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
...
Ve sıfırlar da orada ...
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$
...
Tüm dosya türlerini veya herhangi bir dosya türünü belirtebilirsiniz. Sadece tek bir dosya türü için bunu yapmak ls
, terminal kaçışları için bazı varsayılan derleme değerlerini içerdiği için istediğinizi elde edemeyebilir . API'yi tek bir arayüz olarak ele almak için çok daha iyi bir şey yapardınız. Geçerli ortam dircolors
yapılandırılmış varsayılanları ayrıştırıp atamanın basit bir yolu :
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
Ana dizinimdeki çıktısı şöyle:
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/
Bunu da ile çalıştırabilirsiniz cat -A
ve karşılaşacağınız tek fark $
, yeni satırlar için görmenizdir - tarafından basılamaz karakter yokturls --color=always
bu yapılandırma ile - yalnızca burada gördüğünüz şeydir.
ls
varsayılan terminal çıkışlarını şu şekilde ekler:
${lc}${type_code}${rc}FILENAME${lc}${rs}${rc}
... $lc
(kodun solunda) , $rc
(kodun sağında) ve $rs
(sıfırla) için varsayılan değerler şunlardır:
\033 - ESCAPE
m - END ESCAPE
0 - reset
...sırasıyla. ${type_code}
çeşitli fi
(normal dosya - varsayılan ayar) , di
(dizin) , ln
(bağlantı) ve bildiğim diğer tüm dosya türleri için kullanılır. Ayrıca varsayılan olarak ayarlanmamış olan ve burada her satırın başında ile gösterilen $no
(normal) vardır //
. Basit küçük IFS=:
bloğum, yapılandırılabilir her birinin adını kendi değeri olarak ekleyerek ve bir veya iki eğik çizgi ekleyerek çalışır - ancak \0
NUL baytları da bunu yapar.
Varsayılan olarak ilk çıkışından hemen önce ls
bir tane ekler - ancak bu burada doğru bir şekilde temsil edilmez. Bu durumda , her durumda geçerli olan (bitiş kodu) belirttim - belirtildiğinde, arasında başka bir şey elde edemezsiniz ve aksi halde - sadece bir dosya adının hemen ardından ve çıktı başında bir kez sunulur - birinci satırın başındaki ekstra eğik çizgide görebileceğiniz gibi.$rs
$lc
$ec
$rs
$rs
$no
${type_code}
İşte kendime ait bir pasaj $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:...
Ve gerçekte, benim küçük kabuk hack'im muhtemelen aşırı derecede karmaşık - bu değerleri atamak için yaygın olarak mevcut bir arayüz var. dircolors -p
Klibinde dene ve info dircolors
bu konuda daha fazla bilgi için.
Dosya adlarını rastgele dizelere sarabilirsiniz. İsterseniz bunları yorumlayabilirsiniz. Benzer davranışları yalnızca dosya uzantısına göre belirtebilirsiniz. Bu şekilde belirleyemeyeceğiniz çok fazla bir şey yok.
Şimdi sadece bunların hepsini uydurmuyorum - kazara kaynak kodunu tökezledikten sonra öğrendim .
Bu özel yapılandırma ile ls
:
$no
- her kaydın başında kayıt başına bir kez
${type_code}
- dosya türünün kısaltmasını içerecek şekilde her dosya adından hemen önce ve her zaman aynı satırda ve bir sembolik bağlantının hedefini belirten hemen sonra $no
veya hemen ardından 7 boşlukla ayrılmış alanlar oluşur ->
.
$ec
- ilk satırdan hemen önce ve sonra her dosya adını hemen takip eden bir kez.
Diğer tüm değerler boş.
Takip eden şey boş değerlidir ls
ve bu sefer kullanacağım cat -A
, onsuz son örnekle aynı görünecektir:
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^@//$
Ve böylece, böyle bir ong listesindeki tüm sembolik bağlantıları güvenilir bir şekilde kaldırmak -l
için basit bir değişiklik yapabilirsiniz:
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|.*//||'
Çalıştırdıktan sonra sonuçlarım şöyle ...
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/
Yukarıda yaptığım gibi bazı komutları kullanarak:
LSCOLORS=...$(...)fc1=///:fc2=///: ls ... | sed ...
... (burada fc1
ve fc2
sonra listelenen dosya türleri şunlardır set --
alt kabukta) güvenilir Eğer tercih edebilir dosya türlerinden herhangi kombinasyonlarını kaldırmak için hizmet etmelidir ls
dosya adları içerebilir herhangi karakterlerin bakılmaksızın çıktı.