Anda dapat menggunakannya $LS_COLORS
untuk melakukan ini. Jika versi ls
dukungan Anda menentukan warna menggunakan variabel itu, Anda dapat menentukan output per jenis file. Itu perilaku bawaan dan sangat dapat dikonfigurasi. Jadi saya membuat beberapa file untuk demo ini seperti:
for f in 9 8 7 6 5 4 3 2 1
do touch "${f}file" &&
ln -s ./"${f}file" ./"${f}filelink"
done
Jadi sekarang saya akan lakukan:
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
...
Dan null ada di sana juga ...
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$
...
Anda dapat menentukan untuk semua atau semua tipe file. Melakukannya hanya untuk satu tipe file mungkin tidak sesuai keinginan Anda karena ls
telah memasukkan beberapa nilai kompilasi default untuk lolos dari terminal. Anda akan melakukan jauh lebih baik untuk mengatasi api sebagai satu antarmuka. Berikut adalah sedikit cara sederhana untuk mem-parsing dan menetapkan lingkungan yang dircolors
dikonfigurasi secara default saat ini:
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
Outputnya di direktori home saya terlihat seperti ini:
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/
Anda dapat menjalankannya cat -A
juga dan satu-satunya perbedaan yang akan Anda temui adalah Anda akan melihat $
baris baru - tidak ada karakter yang tidak diinginkan yang diperkenalkan ls --color=always
dengan konfigurasi ini - hanya yang Anda lihat di sini.
ls
sisipan terminal defaultnya lolos seperti ini:
${lc}${type_code}${rc}FILENAME${lc}${rs}${rc}
... di mana nilai default untuk $lc
(kiri kode) , $rc
(kanan kode) , dan $rs
(reset) adalah:
\033 - ESCAPE
m - END ESCAPE
0 - reset
... masing-masing. ${type_code}
digunakan untuk menggantikan berbagai fi
(file biasa - default tidak disetel) , di
(direktori) , ln
(tautan) , dan setiap jenis file lain yang saya ketahui. Ada juga $no
(normal) yang juga secara default tidak disetel dan yang di sini diwakili oleh //
pada awal setiap baris. IFS=:
Blok kecil sederhana saya berfungsi hanya dengan menyisipkan nama untuk setiap yang dapat dikonfigurasi juga sebagai nilainya sendiri dan menambahkan satu atau dua garis miring - meskipun \0
byte NUL juga akan berlaku.
Secara default ls
juga akan menyisipkan satu $rs
segera sebelum output pertama $lc
- tetapi ini tidak diwakili secara akurat di sini. Dalam hal ini saya telah menentukan $ec
(kode akhir) yang berlaku dalam $rs
semua kasus - ketika ditentukan Anda tidak mendapatkan tambahan di $rs
antara $no
dan ${type_code}
seperti yang Anda inginkan - hanya menyajikan segera mengikuti nama file dan sekali pada awal output - seperti yang Anda lihat dalam satu tebasan ekstra di baris pertama.
Ini cuplikan dari saya sendiri $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:...
Dan, sebenarnya, hack shell kecil saya mungkin terlalu rumit - ada antarmuka yang tersedia secara luas untuk menetapkan nilai-nilai ini. Coba dircolors -p
di cli Anda dan info dircolors
untuk informasi lebih lanjut tentang itu.
Anda dapat membungkus nama file dalam string acak. Anda dapat berkomentar jika Anda mau. Anda dapat menentukan perilaku serupa hanya berdasarkan ekstensi file. Benar-benar tidak banyak yang tidak bisa Anda tentukan dengan cara itu.
Sekarang saya tidak hanya mengada-ada semua ini - saya mempelajarinya setelah menemukan kode sumber secara tidak sengaja.
Dengan konfigurasi khusus ini ls
akan memancarkan:
$no
- Satu kali per record di awal setiap record
${type_code}
- Sekali segera sebelum setiap nama file untuk menyertakan singkatan dari jenis file dan selalu terjadi pada baris yang sama seperti dan 7 spasi putih dibatasi bidang setelah $no
atau segera setelah ->
menunjukkan target tautan simbolis.
$ec
- Sekali segera sebelum baris pertama dan setelah itu hanya sekali segera mengikuti setiap nama file.
Semua nilai lainnya kosong.
Berikut ini adalah nol-dibatasi ls
, dan kali ini saya akan menggunakan cat -A
, meskipun, tanpa itu, akan terlihat sama dengan contoh terakhir:
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^@//$
Dan untuk menghapus semua tautan simbolis dari -l
daftar ong seperti ini dengan andal , Anda dapat melakukan perubahan sederhana:
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|.*//||'
Hasil saya setelah menjalankan yang terlihat seperti ...
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/
Menggunakan beberapa perintah seperti yang saya lakukan di atas:
LSCOLORS=...$(...)fc1=///:fc2=///: ls ... | sed ...
... (di mana fc1
dan fc2
merupakan tipe file yang terdaftar setelah set --
dalam subkulit) harus berfungsi untuk menghapus semua kombinasi tipe file yang Anda inginkan dari ls
output terlepas dari karakter apa pun yang mungkin berisi nama file.