Bạn có thể sử dụng $LS_COLORS
để làm điều này. Nếu phiên bản ls
hỗ trợ của bạn chỉ định màu bằng biến đó, bạn có thể xác định đầu ra cho mỗi loại tệp. Đó là hành vi dựng sẵn và rất cấu hình. Vì vậy, tôi đã tạo ra một số tệp để demo như thế này:
for f in 9 8 7 6 5 4 3 2 1
do touch "${f}file" &&
ln -s ./"${f}file" ./"${f}filelink"
done
Vì vậy, bây giờ tôi sẽ là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
...
Và null cũng ở đó ...
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$
...
Bạn có thể chỉ định cho tất cả hoặc bất kỳ kiểu tệp nào. Làm như vậy chỉ với một kiểu tệp duy nhất có thể không giúp bạn muốn mặc dù ls
đã kết hợp một số giá trị biên dịch mặc định cho các lần thoát cuối. Bạn sẽ làm tốt hơn nhiều để giải quyết api như một giao diện duy nhất. Đây là một phương tiện nhỏ để phân tích cú pháp và gán các dircolors
mặc định được cấu hình của môi trường hiện tại :
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
Đầu ra của nó trong thư mục nhà của tôi trông như thế này:
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/
Bạn cũng có thể chạy điều đó cat -A
và sự khác biệt duy nhất bạn sẽ gặp là bạn sẽ thấy $
các dòng mới - không có ký tự không thể in được giới thiệu ls --color=always
với cấu hình này - chỉ những gì bạn thấy ở đây.
ls
chèn thiết bị đầu cuối mặc định của nó thoát như thế này:
${lc}${type_code}${rc}FILENAME${lc}${rs}${rc}
... Trong đó các giá trị mặc định cho $lc
(bên trái mã) , $rc
(bên phải mã) và $rs
(đặt lại) là:
\033 - ESCAPE
m - END ESCAPE
0 - reset
...tương ứng. ${type_code}
được sử dụng để thay thế cho các fi
tệp khác nhau (tệp thông thường - không đặt mặc định) , di
(thư mục) , ln
(liên kết) và mọi loại tệp khác mà tôi biết. Ngoài ra còn có $no
(bình thường) cũng là mặc định unset và ở đây được đại diện bởi //
ở đầu mỗi dòng. IFS=:
Khối nhỏ đơn giản của tôi hoạt động chỉ bằng cách chèn tên cho mỗi cấu hình cũng như giá trị riêng của nó và thêm một dấu gạch chéo hoặc hai - mặc dù các \0
byte NUL cũng sẽ làm như vậy.
Theo mặc định ls
cũng sẽ chèn một cái $rs
ngay trước đầu ra đầu tiên của nó $lc
- nhưng điều này không được trình bày chính xác ở đây. Trong trường hợp này, tôi đã chỉ định $ec
(mã kết thúc) đại diện cho $rs
tất cả các trường hợp - khi được chỉ định, bạn không nhận được thêm $rs
giữa $no
và ${type_code}
như bạn muốn - nó chỉ xuất hiện ngay sau tên tệp và một lần khi bắt đầu xuất - như bạn có thể thấy trong một dấu gạch chéo ở đầu dòng một.
Đây là một đoạn trích từ riêng tôi $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:...
Và, trong thực tế, hack shell nhỏ của tôi có lẽ quá phức tạp - có một giao diện có sẵn rộng rãi để gán các giá trị này. Hãy thử dircolors -p
trong cli của bạn và info dircolors
để biết thêm thông tin về điều đó.
Bạn có thể bọc tên tệp theo chuỗi tùy ý. Bạn có thể nhận xét chúng ra nếu bạn muốn. Bạn có thể chỉ định các hành vi tương tự chỉ dựa trên phần mở rộng tệp. Thực sự không có nhiều bạn không thể chỉ định theo cách đó.
Bây giờ tôi cũng không chỉ tạo ra tất cả những điều này - tôi đã tìm hiểu về nó sau khi tình cờ tìm thấy mã nguồn .
Với cấu hình cụ thể này ls
sẽ phát ra:
$no
- một lần cho mỗi bản ghi khi bắt đầu mỗi bản ghi
${type_code}
- một lần ngay trước mỗi tên tệp để bao gồm tên viết tắt của loại tệp và luôn xuất hiện trên cùng một dòng và 7 trường được phân cách bằng khoảng trắng sau $no
hoặc ngay sau ->
dấu hiệu của mục tiêu liên kết tượng trưng.
$ec
- một lần ngay trước dòng đầu tiên và sau đó chỉ một lần ngay sau mỗi tên tệp.
Tất cả các giá trị khác đều trống rỗng.
Những gì tiếp theo là một giới hạn null ls
, và lần này tôi sẽ sử dụng cat -A
, mặc dù, nếu không có nó, nó sẽ trông giống như ví dụ trước:
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^@//$
Và vì vậy, để loại bỏ đáng tin cậy tất cả các liên kết tượng trưng khỏi -l
danh sách ong như thế này, bạn có thể thực hiện một thay đổi đơn giản:
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|.*//||'
Kết quả của tôi sau khi chạy giống như ...
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/
Sử dụng một số lệnh như với lệnh tôi làm ở trên:
LSCOLORS=...$(...)fc1=///:fc2=///: ls ... | sed ...
... (nơi fc1
và fc2
là các kiểu tệp được liệt kê sau set --
trong lớp con) sẽ phục vụ để loại bỏ đáng kể mọi kết hợp kiểu tệp bạn có thể muốn từ ls
đầu ra bất kể ký tự nào có thể chứa tên.