$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
ターミナルエスケープ用のデフォルトのコンパイル値が組み込まれているため、1つのファイルタイプのみに対してこれを行うと、期待どおりにならない場合があります。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=:
ブロックは、それぞれの設定可能な名前を独自の値として挿入し、スラッシュを1つまたは2つ追加する\0
だけで機能しますが、NULバイトでも同様です。
デフォルトでls
は$rs
、最初の出力の直前に1つも挿入されますが$lc
、ここでは正確に表現されていません。この場合、私が指定した$ec
(終了コード)のために立っている$rs
すべてのケースでは-それが指定されているときに、余分な取得しない$rs
間$no
と${type_code}
、あなたがそうでなければ同じように-それだけプレゼント直後にファイル名を以下と出力の開始時に一度-行1の先頭にある1つの余分なスラッシュでわかるように。
これは私自身のスニペットです $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:...
実際、私の小さなシェルハックはおそらく非常に複雑です。これらの値を割り当てるための広く利用可能なインターフェイスがあります。dircolors -p
cliで試してみてくださいinfo dircolors
。その詳細については。
任意の文字列でファイル名をラップできます。必要に応じてコメントアウトできます。ファイル拡張子のみに基づいて同様の動作を指定できます。あなたがそのように指定することができない多くは本当にありません。
今、私はこのすべてを作り上げているだけではありません- 偶然ソースコードにつまずいた後、私はそれについて学びました。
この特定の構成でls
は、以下が出力されます。
$no
-各レコードの開始時にレコードごとに1回
${type_code}
-各ファイル名の直前に1回、ファイルの種類の略語を含め、常に同じ行にあり、シンボリックリンクのターゲットを示す後$no
または直後にある7つの空白区切りフィールド->
。
$ec
-最初の行の直前に1回、その後各ファイル名の直後に1回のみ。
他のすべての値は空です。
続くものは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
にかかわらず、ファイル名が含まれている可能性のあるすべての文字の出力を。