如何在pastebinit中自动检测文件类型?

如何在pastebinit中自动检测文件类型?

我用粘贴比尼特分享片段。正如您所看到的,它有一个-f开关,因此渲染的网页会根据文件的格式突出显示上传的文件(例如-f python-f bash)。

现在,我想以某种方式自动检测代码片段文件类型,这样我就不需要手动给出正确的开关。

  1. 在pastebinit中可以这样做吗?
  2. 是否可以将其包装在脚本中并使用其他实用程序检测文件类型?

例如,我尝试使用file但我认为它在这里没有用:

$ file --mime-type -b main.c 
text/x-c  # Should have been C

$ file --mime-type -b script.py 
text/x-python  # Should have been Python

$ file --mime-type -b README.md 
text/plain  # Should have been Markdown

$ file --mime-type -b ~/.bashrc 
text/plain  # Should have been Bash

$ file --mime-type -b ~/blah/main.cpp 
text/x-c  # Should have been Cpp

答案1

没有任何自动工具可以仅通过查看给定文件的内容或名称来识别给定文件的类型。file和其他类似的工具只需进行有根据的猜测,而不必总是正确的,因为某些文件格式可能会重叠(一个有趣的事实 - Slackware Linux 打包日志文件过去按文件识别为 Quake 文件)或者因为某些文件格式不够具体,无法轻松与其他文件格式区分开来(Markdown 的全部目的是使 .md 文件看起来像常规文本文件)。

在您的示例中,尽管所有文件除外.bashrc都有不同的扩展名,因此您可以编写一个可以使用它们来识别类型的脚本,但您应该记住,在 *nix 系统上,文件扩展名仅对某些程序重要,而内核并不关心。例如,创建script.shshell脚本:

$ cat << EOF > script.sh
> #!/usr/bin/env bash
>
> echo hi
> EOF

设置可执行位并运行它:

$ chmod +x ./script.sh
$ ./script.sh
hi

将其重命名为script.md并运行:

$ mv ./script.sh ./script.md
$ ./script.md
hi

正如您所看到的,即使将其重命名为script.md.

这将是相当用于编写一个工具,可以根据任何现代语言(例如 Python 或 Bash)的文件名扩展名来猜测文件类型。这是whatisthis.shBash 中的一个示例:

#!/usr/bin/env bash

if [ ! $# -eq 1 ]
then
    printf "Usage: %s file_with_extension\n" "$0" >&2
    exit 1
fi

ext="$(rev <<< "$1" | cut -d . -f1 | rev)"

declare -A extensions=(
    [c]=C
    [py]=Python
    [md]=Markdown
    [cpp]=Cpp
)

printf "%s\n" "${extensions["$ext"]}"

用法:

$ ./whatisthis.sh README.md
Markdown
$ ./whatisthis.sh main.py
Python
$ ./whatisthis.sh main.c
C

当然还有很多,可能不同文件类型有数千种不同的文件扩展名 并且很可能有人已经编写了一个更强大的脚本,该脚本使用文件扩展名来识别类型。

当涉及到它时,可以通过添加后.bashrc进行识别- 添加它不会破坏它,因为当它由每个新的交互式 shell 获取时,并且以 开头的每一行都被视为注释。file#!/usr/bin/env bash#

总而言之 - 没有办法自动检测文件类型。为了获得最佳结果,您应该组合file并查看文件扩展名,但最终始终由人类用户来了解给定文件的用途。

相关内容