Est-il possible de faire ls
distinguer les scripts exécutables des vrais binaires compilés ?
Les permissions sont le plus souvent les mêmes (+x
), et avec ls -F
vous obtenez un suffixe astérisque (*
) pour les deux, il est donc difficile de les distinguer. J'ai un script pour configurer les couleurs de ls
, mais cela dépend du fait que le fichier soit exécutable ou non, donc ils s'affichent de la même manière :
BG='01;32' # green
EX="ex=$BG" # file with execute permission
Je ne veux pas dépendre de l'extension car beaucoup de ces fichiers ne l'ont pas.
Je veux ça donc quand je vois un message d'erreur bizarre et que je pense, "Quel code a causé ça?", Je sais s'il est sûr ou non de cat
le fichier.
S'il n'y a pas de solution standard, qu'en est-il de l'analyse de la sortie de file
, dans une fonction commune, et insérant une marque distinctive ? Ou serait-ce beaucoup trop lent pour ls
?
Réponse acceptée :
Vous devez examiner le contenu d'un fichier pour faire la distinction entre les binaires et les scripts. ls
ne le fera pas, il ne regarde que les noms de fichiers et les métadonnées (type, permission, etc.).
Voici un analyseur brut pour file
qui colore différemment les scripts et les binaires. Il agit comme ls -d
; l'ajout de métadonnées nécessiterait un travail de patch-up qui nécessite une approche plus directe (par exemple en Perl ou Python) ; utilisez lsx somedir/*
pour lister le contenu d'un répertoire. Les noms de fichiers sont supposés ne pas contenir de nouvelles lignes ni de deux-points (vous pouvez changer le :
séparateur pour une autre chaîne avec le -F
option pour file
).
lsx () { file -iN -- "[email protected]" | tandis que IFS=lire -r ligne ; faire nom=${ligne%% :*} ; type=${line#* :} color=0 case $type in application/x-executable*) color='32';; text/x-shellscript*) color='01;32';; application/*zip*) color='31';; esac printf '