创建与管理文件

在终端中对文件和目录进行日常维护是 Linux 实操的核心基本功。本章将讲解如何创建、移动、复制、重命名和删除文件及目录,以及如何准确判断文件的类型。

创建与管理目录树

为了直观地展示文件与目录的演变过程,我们将使用 tree 树形结构工具来展示一系列操作:

1. 创建文件与目录:touchmkdir

  • touch 用于创建文件。如果目标文件不存在,它会新建一个空文件;如果文件已存在,它不会改变文件内容,而是更新该文件的最近访问与修改时间戳
  • mkdir 建立一个名为 Storage 的目录。
    crow@opsbox:~$ touch info.txt
    crow@opsbox:~$ mkdir Storage
    
  • 此时目录结构如下:
    .
    ├── info.txt
    └── Storage
    

注意

此时系统会在当前目录下生成一个名为 info.txt 的空文件。要向文件中写入内容,虽然我们可以利用后文会讲到的输出重定向写入简单内容,但在下一模块中,我们将学习如何使用强大的文本编辑器(如 nanovim)在终端里直接编辑文件。

2. 建立递归父目录:mkdir -p

如果需要一次性建立多层嵌套的目录,需要追加 -p 选项,这能防止因上级文件夹不存在而报错:

crow@opsbox:~$ mkdir -p Storage/local/user/documents
  • 此时的目录树演变为:
    .
    ├── info.txt
    └── Storage
        └── local
            └── user
                └── documents
    

3. 指定路径创建文件

我们可以直接通过相对路径,在刚刚创建的叶子目录下创建一个新文件 userinfo.txt

crow@opsbox:~$ touch ./Storage/local/user/userinfo.txt
  • 结构更新为:
    .
    ├── info.txt
    └── Storage
        └── local
            └── user
                ├── documents
                └── userinfo.txt
    

移动、复制与删除文件

4. 重命名与移动文件:mv

  • 重命名:将当前目录下的 info.txt 重命名为 information.txt
    crow@opsbox:~$ mv info.txt information.txt
    
  • 移动:同时在当前目录新建一个 readme.txt 文件,然后将 information.txtreadme.txt 一并移入 Storage 目录下:
    crow@opsbox:~$ touch readme.txt
    crow@opsbox:~$ mv information.txt readme.txt Storage/
    
  • 结构更新为:
    .
    └── Storage
        ├── information.txt
        ├── local
        │   └── user
        │       ├── documents
        │       └── userinfo.txt
        └── readme.txt
    

注意

底层机制差异: 在同一文件系统内,mv 通常通过改写目录项完成移动或重命名,不会复制文件的数据块,因此移动数吉字节(GB)的文件也往往很快。若源和目标位于不同的文件系统,mv 会改为复制数据后再删除源文件。cp 则始终会在目标位置创建新的文件数据。

5. 复制文件:cp

我们将 Storage 目录下的 readme.txt 复制一份到其子目录 local 下:

crow@opsbox:~$ cp Storage/readme.txt Storage/local/
  • 结构更新为:
    .
    └── Storage
        ├── information.txt
        ├── local
        │   ├── readme.txt
        │   └── user
        │       ├── documents
        │       └── userinfo.txt
        └── readme.txt
    

6. 删除文件与目录:rm

需要注意,通过终端删除的文件通常不会进入回收站;文件名与目录项会被移除,数据块则标记为空闲,是否还能恢复取决于文件系统、后续写入和工具。

  • 删除普通文件:
    crow@opsbox:~$ rm Storage/readme.txt
    
  • 递归删除整个目录及其下属所有内容(必须使用 -r-R 递归标志):
    crow@opsbox:~$ rm -R Storage/local
    

识别文件类型:file

与 Windows 系统不同,Linux 系统本身并不依赖文件扩展名(如 .txt.jpg)来决定如何处理文件。在 Linux 下,即使你把一个文本文件命名为 data.jpg,它依然是一个文本文件。扩展名只是一种方便人类阅读的标记,并不保证其内容真实性。

为了准确判断文件的真实数据格式,我们可以使用 file 命令。它通过解析文件内部的特殊二进制标记(魔法数字)来检测文件的类型:

crow@opsbox:~$ file Storage/information.txt
Storage/information.txt: ASCII text

如果是一个纯文本文件,命令执行后会输出类似 Storage/information.txt: ASCII text 的回显。

提示

魔法数字的威力 我们可以做个有趣的实验:将一个名为 photo.png 的真实图片重命名为 photo.txt,接着运行 file photo.txt。你会发现系统依然能准确指出 photo.txt: PNG image data。这是因为 file 读取了该文件头部的魔法数字(PNG 的前 8 字节固定为 89 50 4E 47 0D 0A 1A 0A),从而看穿了它的“伪装”。这在恶意代码分析中常用于发现隐藏的文件。