在 Ubuntu 中,空文件和文本文件一样吗?

Tan*_*ros 6 command-line files

我是 Ubuntu 的新手。

如果在shell中我这样做:

touch file
Run Code Online (Sandbox Code Playgroud)

它在当前目录中创建一个文件,如果我打开这个文件,它会显示为一个空白文本文件。另外,我可以做

echo "test" > file
cat file
Run Code Online (Sandbox Code Playgroud)

我得到的是一个字符串。

那么空文件等于文本文件吗?

vid*_*rlo 15

它在当前目录中创建一个文件,如果我打开这个文件,它会显示为一个空白文本文件。

如果您运行touch non_existing_filename,它将创建一个空文件。该文件是空的,不包含任何内容。这并不意味着它是一个文本文件或任何其他类型的文件。

如果您运行touch existing_file, touch 将更新文件上的时间戳。

echo "test" > file
cat file
Run Code Online (Sandbox Code Playgroud)

我得到的是一个字符串。那么空文件等于文本文件吗?

是的,如果你将一个字符串写入一个空文件,你会在读取文件内容时得到一个字符串。请注意,>覆盖文件中的所有内容,如果文件为空、不存在或其他文件(如图像),结果将相同。您可以使用>>将文本附加到文件。

需要注意的是工具,如重定向(>>>等等),不关心文件类型。将文本字符串附加到包含例如 JPEG 图像的文件是一种完全有效的操作。这也是对cat某些图像文件的完全有效的操作。并不是我建议您尝试;它不会在您的终端上正确显示。

文件系统没有文件类型的概念。它不关心文件具有什么内容 - 并且文件系统级别的不同文件类型之间没有区别。

传统上,Unix 对文件类型的依赖程度远低于 Windows,并且有一个名为 的文本文件是完全合理的README,而在 Windows 上,.txt文本文件的扩展名是很常见的。

如果您想知道手头上有什么样的文件,该实用程序file非常有用:

$ file  auth.log
auth.log: ASCII text
$ file Dokken.mp4 
Dokken.mp4: ISO Media, MP4 Base Media v1 [IS0 14496-12:2003]
Run Code Online (Sandbox Code Playgroud)

file根据对每个文件的共同特征(通常称为文件签名)的描述来决定内容类型。例如,debian 总是以 bytes 开头21 3C 61 72 63 68 3E,如果我们在文件的开头看到这些字节,我们可能手头上有一个 debian 包。

file实用程序使用所谓的魔法文件来决定它正在查看的文件类型。更多关于这方面的信息可以在magic 的手册页中找到(例如man magic在Linux 系统上)。

请注意,这file并非万无一失,只是一个非常好的指标。如果我创建一个包含字节的ed ab ee db 0d 25文件,文件会将其标识为/tmp/foobar: RPM v13.37 bin. ed ab ee db是 RPM 文件所需的标头0d 25,十六进制为 1337...该文件无论如何都不是有效的 RPM 包。


Kyl*_*e H 9

如果您对不存在的文件使用 touch,它将为您创建一个空文件。如果您在现有文件上使用它,它将更新访问时间等。使用 file 命令检查文件的类型。可以有空二进制文件。

对于这些文件file实用程序返回以下内容:

$ touch new
$ file new
new: empty
Run Code Online (Sandbox Code Playgroud)

但是对于带有一些文本的文件,它将返回“ASCII 文本”

$ echo "text" > text
$ file text 
text: ASCII text
Run Code Online (Sandbox Code Playgroud)

但是某些图形应用程序(例如 Pluma 或 Gedit)会将这两个文件都作为文本打开。


Pan*_*her 5

Linux / Unix 中有一句老话

一切都是文件

话虽如此,Linux 通过魔法来识别文件类型,而不一定是通过内容

请参阅Ubuntu 如何知道没有扩展名的文件是什么文件类型?

  • 这不仅仅是一句老话,它是 *nix 设计的基础(并且早在 Linux 之前就存在了)。不仅一切都是文件,所有文件都只是文件。它是否是一个文本文件只是其中的内容的问题。如果它只包含 ASCII 字符,那么它就是文本(至少对说英语的人来说)。 (3认同)