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 包。
如果您对不存在的文件使用 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)会将这两个文件都作为文本打开。
Linux / Unix 中有一句老话
一切都是文件
话虽如此,Linux 通过魔法来识别文件类型,而不一定是通过内容
请参阅Ubuntu 如何知道没有扩展名的文件是什么文件类型?