Hacer ls distinguir guiones de binarys en salida

¿Es posible hacer que ls distinga los scripts ejecutables de los binarys reales comstackdos?

Los permissions suelen ser los mismos ( +x ), y con ls -F se obtiene un sufijo de asterisco ( * ) para ambos, por lo que es difícil diferenciarlos. Tengo un script para configurar los colors de ls , pero depende de que el file sea ejecutable o no, por lo que se muestran de la misma manera:

 BG='01;32' # green EX="ex=$BG" # file with execute permission 

No quiero depender de la extensión ya que muchos de estos files no la tienen.

Quiero esto, así que cuando veo un extraño post de error y pienso: "¿Qué código causó eso?", Sé si es seguro o no cat del file.

Si no hay una solución estándar, ¿qué hay de analizar el resultado del file , en una function común, e insert alguna marca distintiva? ¿O eso sería demasiado lento para ls ?

Necesita ver el contenido de un file para distinguir entre binarys y scripts. No hará esto, solo mira los nombres de files y metadatos (tipo, permiso, etc.).

Aquí hay un analizador crudo para el file que colorea los guiones y los binarys de manera diferente. Actúa como ls -d ; agregar metadatos requeriría un trabajo de parche que requiera un enfoque más directo (por ejemplo, en Perl o Python); use lsx somedir/* para listr el contenido de un directory. Se supone que los nombres de los files no contienen líneas nuevas ni dos puntos (puede cambiar el separador para alguna otra cadena con la opción -F para file ).

 lsx () { file -iN -- "$@" | 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 '\033[%sm%s\033[0m\n' "$color" "$name" done } 

Podrías jugar con dircolors . Eche un vistazo a la salida de dircolors -p . En mis sistemas, encuentro las siguientes definiciones relevantes:

 # This is for files with execute permission: EXEC 01;32 … # Or if you want to colorize scripts even if they do not have the # executable bit actually set. #.sh 01;32 

Si elimina el # en la última línea y escribe .sh 07;31 sus scripts de shell (todos los files con extensión .sh ) parpadearán en rojo.

Guarde su configuration en ~/.dircolors y agregue a su .bashrc la línea:

 eval "$(dircolor $HOME/.dircolors)"