如何判断一个文件是否是文本文件?

如何判断一个文件是否是文本文件?

已经有 问题在这里讨论这个主题,但两者都解决了脚本中的错误,而不是实际的标题。

我想开发一个程序,根据文件的类型获取有关文件的一些基本信息。我想区分目录、文本和二进制数据。

到目前为止我正在使用file

case "$(file --dereference $arg)" in
  *directory) ls -l --color=auto --almost-all --human-readable --group-directories-first --file-type --dereference-command-line "$@";;
  *text*|*JSON*) bat --style header "$@";;
esac

这大部分都有效,但正如你所看到的,我已经不得不添加一个例外JSONasfile标识为JSON数据没有提及文本。问题是有更多的例外情况,我不想单独添加它们。

file有没有办法从或另一个标准程序获取有关内容类型的更多一般信息?

答案1

经过一番尝试,我自己找到了一个不错的解决方案:

case "$(file --dereference --mime $arg)" in
 *inode/directory*) ls -l --color=auto --almost-all --human-readable --group-directories-first --file-type --dereference-command-line "$@";;
 *binary) ;;
 *) bat --style header "$@";;
esac

它本质上反转了该方法 -file --mime输出一个字符集,即二进制对于所有非文本文件。然后它会处理所有不是二进制作为文本,似乎效果很好。

如果您不关心目录 - 它们也被分类为二进制文件,那么您可以使用它:

case "$(file --dereference --mime $arg)" in
 *binary) echo "$arg is not text";;
 *) echo "$arg is text";;
esac

相关内容