在 Ubuntu 中,空文件与文本文件相同吗?

在 Ubuntu 中,空文件与文本文件相同吗?

我是 Ubuntu 新手。

如果在 shell 中我这样做:

touch file

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

echo "test" > file
cat file

我得到的是一个字符串。

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

答案1

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

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

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

echo "test" > file
cat file

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

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

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

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

传统上,Unix 对文件类型的依赖程度远低于 Windows,因此将文本文件命名为 是完全合理的,而在 Windows 上,将文本文件的README扩展名改为 是很常见的。.txt

如果你想知道你手上有什么类型的文件,这个实用程序file相当有用:

$ file  auth.log
auth.log: ASCII text
$ file Dokken.mp4 
Dokken.mp4: ISO Media, MP4 Base Media v1 [IS0 14496-12:2003]

file根据每个文件的共同特征描述来决定内容类型,通常称为文件签名。例如,debian 总是以字节开头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 bined ab ee db是 RPM 文件所需的标头,0d 25十六进制为 1337... 无论如何,此文件都不是有效的 RPM 包。

答案2

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

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

$ touch new
$ file new
new: empty

但对于包含一些文本的文件,它将返回“ASCII 文本”

$ echo "text" > text
$ file text 
text: ASCII text

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

答案3

Linux/Unix 中有一句老话

一切皆文件

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

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

答案4

总结:不。文本文件不能为空,否则会被检测为空。当然,它可以为空。

touch设置文件时间戳,如果文件不存在则创建文件。那么,空文件是什么类型的文件呢?

$ ls -l test
-rw-r--r-- 1 user users 0  1. Jän 18:36 test
$ file test
test: empty

file实用程序将其视为单独的文件类型。这是因为空文件可以是任何对许多应用程序有意义的东西:它可以是空的纯文本文件、空的 CSV 表、空的原始数据流(它不能是 GZ、JPEG 等类型的空文件,因为这些文件没有 0 字节,即使应用程序将它们视为空,因为它们都包含标题和其他内容)。因此,类型不能更好地定义为空的

相关内容