คุณสามารถใช้$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
ได้รวมไว้กับค่าการคอมไพล์เริ่มต้นสำหรับการหลบหนีเทอร์มินัล คุณควรทำอย่างไรดีกว่าที่จะกล่าวถึง 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
(ไฟล์ปกติ - unset เริ่มต้น) , di
(ไดเรกทอรี) , ln
(ลิงค์)และไฟล์ทุกชนิดอื่น ๆ ฉันรู้ นอกจากนี้ยังมี$no
(ปกติ)ซึ่งเป็นค่าเริ่มต้นโดยไม่มีการตั้งค่าและที่นี่แสดงโดย//
ที่จุดเริ่มต้นของแต่ละบรรทัด IFS=:
บล็อกเล็ก ๆ ของฉันนั้นใช้การได้เพียงแค่ใส่ชื่อของแต่ละตัวที่สามารถกำหนดค่าได้ด้วยค่าของมันเองและเพิ่มเครื่องหมายทับหรือสอง - แม้ว่า\0
NUL ไบต์จะทำเช่นกัน
โดยค่าเริ่มต้นls
จะแทรกหนึ่ง$rs
ก่อนหน้าเอาต์พุตแรกทันที$lc
แต่นี่ไม่ได้แสดงที่นี่อย่างถูกต้อง ในกรณีนี้ฉันได้ระบุ$ec
(รหัสสิ้นสุด)ซึ่งย่อมาจากใน$rs
ทุกกรณี - เมื่อมีการระบุว่าคุณไม่ได้รับการเพิ่มเติม$rs
ระหว่าง$no
และ${type_code}
ตามที่คุณต้องการ - มันจะแสดงเฉพาะชื่อไฟล์ทันทีและเมื่อเริ่มต้นของเอาต์พุต - อย่างที่คุณเห็นในเครื่องหมายทับหนึ่งอันที่หัวบรรทัดหนึ่ง
นี่เป็นตัวอย่างจากฉันเอง $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
- หนึ่งครั้งต่อการบันทึกที่จุดเริ่มต้นของแต่ละการบันทึก
${type_code}
- หนึ่งครั้งก่อนหน้าชื่อไฟล์แต่ละชื่อทันทีเพื่อรวมตัวย่อของประเภทไฟล์และจะเกิดขึ้นในบรรทัดเดียวกับและ 7 ช่องว่างที่คั่นด้วยช่องว่างหลัง$no
หรือทันทีหลังจากที่->
แสดงถึงเป้าหมายของลิงก์สัญลักษณ์
$ec
- หนึ่งครั้งก่อนหน้าบรรทัดแรกและหลังจากนั้นตามชื่อไฟล์แต่ละครั้งทันที
ค่าอื่น ๆ ทั้งหมดว่างเปล่า
สิ่งต่อไปนี้เป็นตัวคั่นที่ไม่มีค่าใช้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^@//$
ดังนั้นในการลบลิงก์สัญลักษณ์ทั้งหมดออกจาก-l
รายชื่อ ong อย่างน่าเชื่อถือคุณอาจทำการเปลี่ยนแปลงง่าย ๆ :
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 --
อยู่ใน subshell)ควรทำหน้าที่ลบชุดไฟล์ประเภทที่คุณต้องการจากls
เอาท์พุทได้อย่างน่าเชื่อถือโดยไม่คำนึงถึงอักขระใด ๆ ที่ชื่อไฟล์อาจมี