Ist es möglich, ls
zu erstellen ausführbare Skripte von tatsächlich kompilierten Binärdateien unterscheiden?
Die Berechtigungen sind meistens gleich (+x
) und mit ls -F
Sie erhalten ein Sternchen-Suffix (*
) für beide, also ist es schwer, sie auseinander zu halten. Ich habe ein Skript, um die Farben von ls
einzurichten , aber es hängt davon ab, ob die Datei ausführbar ist oder nicht, also werden sie gleich angezeigt:
BG='01;32' # green
EX="ex=$BG" # file with execute permission
Ich möchte mich nicht auf die Erweiterung verlassen, da so viele dieser Dateien sie nicht haben.
Ich möchte das, damit ich, wenn ich eine bizarre Fehlermeldung sehe und denke:„Welcher Code hat das verursacht?“, weiß, ob es sicher ist, cat
zu verwenden oder nicht die Datei.
Wenn es keine Standardlösung gibt, was ist mit dem Parsen der Ausgabe von file
, in einer gemeinsamen Funktion, und das Einfügen eines Unterscheidungsmerkmals? Oder wäre das viel zu langsam für ls
?
Akzeptierte Antwort:
Sie müssen sich den Inhalt einer Datei ansehen, um zwischen Binärdateien und Skripten zu unterscheiden. ls
tut dies nicht, es betrachtet nur Dateinamen und Metadaten (Typ, Berechtigung usw.).
Hier ist ein grober Parser für file
das Skripte und Binärdateien unterschiedlich einfärbt. Es verhält sich wie ls -d
; das Hinzufügen von Metadaten würde einen Patch-up-Job erfordern, der einen direkteren Ansatz erfordert (z. B. in Perl oder Python); Verwenden Sie lsx somedir/*
um den Inhalt eines Verzeichnisses aufzulisten. Es wird davon ausgegangen, dass Dateinamen weder Zeilenumbrüche noch Doppelpunkte enthalten (Sie können den :
ändern Trennzeichen für einen anderen String mit -F
Option zum file
).
lsx () { file -iN -- "[email protected]" | while IFS=read -r line; do name=${line%%:*}; type=${line#*:} color=0 case $type in application/x-executable*) color='32';; text/x-shellscript*) color='01;32';; application/*zip*) color='31';; esac printf '