Sie können dazu verwenden $LS_COLORS
. Wenn Ihre Version von ls
die Angabe der Farben mithilfe dieser Variablen unterstützt, können Sie die Ausgabe pro Dateityp definieren. Es ist eingebautes Verhalten und sehr konfigurierbar. Deshalb habe ich einige Dateien erstellt, um dies zu demonstrieren:
for f in 9 8 7 6 5 4 3 2 1
do touch "${f}file" &&
ln -s ./"${f}file" ./"${f}filelink"
done
Also mache ich jetzt:
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
...
Und die Nullen sind auch da ...
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$
...
Sie können für alle oder beliebige Dateitypen angeben. Wenn Sie dies nur für einen Dateityp tun, erhalten Sie möglicherweise keine Ergebnisse, da ls
einige standardmäßige Kompilierungswerte für Terminal-Escapes enthalten sind. Es ist viel besser, die API als einzelne Schnittstelle zu adressieren. Im Folgenden finden Sie eine einfache Methode zum Parsen und Zuweisen der Standardeinstellungen für die aktuelle Umgebung 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
Die Ausgabe in meinem Home-Verzeichnis sieht folgendermaßen aus:
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/
Sie können das auch ausführen, cat -A
und der einzige Unterschied besteht darin, dass Sie $
für Zeilenumbrüche sehen - ls --color=always
mit dieser Konfiguration werden keine nicht druckbaren Zeichen eingeführt - nur das, was Sie hier sehen.
ls
fügt sein Standardterminal so ein:
${lc}${type_code}${rc}FILENAME${lc}${rs}${rc}
... wobei die Standardwerte für $lc
(links vom Code) , $rc
(rechts vom Code) und $rs
(zurückgesetzt) sind:
\033 - ESCAPE
m - END ESCAPE
0 - reset
...beziehungsweise. ${type_code}
wird verwendet, um für die verschiedenen fi
(reguläre Datei - Standardeinstellung nicht festgelegt) , di
(Verzeichnis) , ln
(Verknüpfung) und jeden anderen mir bekannten Dateityp zu stehen. Es gibt auch $no
(normales), das ebenfalls standardmäßig nicht gesetzt ist und das hier //
am Anfang jeder Zeile dargestellt wird. Mein einfacher kleiner IFS=:
Block fügt einfach den Namen für jedes konfigurierbare Element als eigenen Wert ein und fügt ein oder zwei Schrägstriche hinzu - obwohl auch \0
NUL-Bytes ausreichen würden.
Standardmäßig ls
wird auch eine $rs
unmittelbar vor der ersten Ausgabe eingefügt $lc
- dies wird hier jedoch nicht genau dargestellt. In diesem Fall habe ich $ec
(Endcode) angegeben, der $rs
in allen Fällen für steht - wenn es angegeben ist, erhalten Sie $rs
zwischen $no
und ${type_code}
wie sonst auch kein Extra - es wird nur unmittelbar nach einem Dateinamen und einmal am Anfang der Ausgabe angezeigt - Wie Sie in dem einen zusätzlichen Schrägstrich am Anfang der ersten Zeile sehen können.
Hier ist ein Ausschnitt von mir $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:...
Und in Wahrheit ist mein kleiner Shell-Hack wahrscheinlich zu kompliziert - es gibt eine weithin verfügbare Schnittstelle, um diese Werte zuzuweisen. Versuchen Sie es dircolors -p
in Ihrem CLI und info dircolors
für weitere Informationen dazu.
Sie können die Dateinamen in beliebige Zeichenfolgen einschließen. Sie können sie auskommentieren, wenn Sie möchten. Sie können ähnliche Verhaltensweisen nur basierend auf der Dateierweiterung angeben. Es gibt wirklich nicht viel, was man so nicht spezifizieren kann.
Jetzt denke ich mir auch nicht nur das alles aus - ich habe es erfahren, nachdem ich versehentlich über den Quellcode gestolpert bin .
Mit dieser speziellen Konfiguration ls
wird Folgendes ausgegeben:
$no
- Einmal pro Datensatz am Anfang jedes Datensatzes
${type_code}
- Einmal unmittelbar vor jedem Dateinamen, um eine Abkürzung des Dateityps einzufügen, die immer in der gleichen Zeile wie und in 7 durch Leerzeichen getrennten Feldern nach $no
oder unmittelbar nach ->
dem Ziel eines symbolischen Links vorkommt.
$ec
- einmal unmittelbar vor der ersten Zeile und danach nur einmal unmittelbar nach jedem Dateinamen.
Alle anderen Werte sind leer.
Was folgt, ist eine durch Nullen getrennte Zeichenfolge ls
, und dieses Mal werde ich sie verwenden cat -A
. Ohne diese Zeichenfolge würde sie jedoch genauso aussehen wie das letzte Beispiel:
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^@//$
Um alle symbolischen Links aus einer -l
solchen Liste zuverlässig zu entfernen , können Sie eine einfache Änderung vornehmen:
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|.*//||'
Meine Ergebnisse nach dem Laufen sehen so aus ...
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/
Verwenden Sie einen Befehl wie den oben beschriebenen:
LSCOLORS=...$(...)fc1=///:fc2=///: ls ... | sed ...
... (wo fc1
und fc2
welche Dateitypen nach set --
in der Subshell aufgelistet sind) sollten dazu dienen, Kombinationen von Dateitypen, die Sie möchten, zuverlässig aus der ls
Ausgabe zu entfernen, unabhängig davon, welche Zeichen die Dateinamen enthalten könnten.