आप ऐसा करने के $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
टर्मिनल एस्केप के लिए कुछ डिफ़ॉल्ट संकलन मूल्यों को शामिल किया गया है। आप एपीआई को एकल इंटरफ़ेस के रूप में संबोधित करने के लिए बहुत बेहतर करेंगे। यहां वर्तमान परिवेश 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=:
ब्लॉक प्रत्येक विन्यास के लिए नाम को अपने मूल्य के रूप में सम्मिलित करके और एक स्लैश या दो जोड़कर काम करता है - हालाँकि\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}
- एक बार फ़ाइल के प्रकार का संक्षिप्त नाम शामिल करने के लिए तुरंत प्रत्येक फ़ाइल नाम से पहले और हमेशा एक प्रतीकात्मक लिंक के लक्ष्य को दर्शाते हुए $no
या उसके तुरंत बाद 7 व्हाट्सएप सीमांकित फ़ील्ड के रूप में एक ही पंक्ति पर होने वाली ->
।
$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
, आप एक साधारण बदलाव कर सकते हैं:
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
कोई भी वर्ण फ़ाइल नाम शामिल हो सकता है के उत्पादन में परवाह किए बिना।