使 ls 在输出中区分脚本和二进制文件

使 ls 在输出中区分脚本和二进制文件

是否可以ls区分可执行脚本和实际编译的二进制文件?

权限通常是相同的 ( +x),并且两者都ls -F带有星号后缀 ( *),因此很难区分它们。我有一个脚本来设置 的颜色ls,但它依赖于文件是否可执行,因此它们显示相同:

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

我不想依赖扩展名,因为很多文件都没有它。

cat我想要这个,所以当我看到一些奇怪的错误消息并思考“什么代码导致了这个?”时,我知道它对文件是否安全。

如果没有标准解决方案,那么file在一个常用函数中解析 , 的输出并插入一些独特的标记又如何呢?或者这对于 来说太慢了ls

答案1

您需要查看文件的内容来区分二进制文件和脚本。ls不会这样做,它只查看文件名和元数据(类型、权限等)。

这是一个粗略的解析器,用于file以不同的方式为脚本和二进制文件着色。它的作用就像ls -d;添加元数据需要进行修补工作,这需要更直接的方法(例如在 Perl 或 Python 中);用于lsx somedir/*列出目录的内容。假定文件名不包含换行符或冒号(您可以使用选项更改:其他字符串的分隔符)。-Ffile

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
}

答案2

你可以玩玩dircolors。看看 的输出dircolors -p。在我的系统上,我找到以下相关定义:

# 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

如果删除#最后一行并编写.sh 07;31shell 脚本(所有带有扩展名的文件.sh)将以红色闪烁。

保存您的设置~/.dircolors并添加到您的.bashrc行:

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

相关内容