# 文件管理

本节介绍对文件进行简单管理的命令。

- [ls 命令](#ls-命令)：列出文件

- [mkdir 命令](#mkdir-命令)：创建目录

- [cp 命令](#cp-命令)：复制文件

- [rm 命令](#rm-命令)：删除文件

- [touch 命令](#touch-命令)：创建空文件

- [chmod 命令](#chmod-命令)：改变文件权限

- [chown 命令](#chmod-命令)：改变文件所有者

- [nano 命令](#nano-命令)：编辑文本类文件

## ls 命令

`ls` 命令可以查看一个文件夹下的所有文件，或查找一个或单个文件，支持使用正则表达式。

用法：

```txt
ls [option] <路径>
```

常见选项如下：

- -a：同时列出隐藏文件

- -l：显示详细信息

- -h：改用 MB 或 GB 的文件大小计数方式，配合 `-l` 参数使用

查看 `/etc` 目录下的文件：

```bash
ls /etc
```

查看当前目录下的所有文件，含隐藏文件：

```bash
ls -a
```

查看上级目录下文件的详细信息，并以 MB 或 GB 的文件大小计数方式列出所有文件，含隐藏：

```bash
ls -alh ../
```

## mkdir 命令

`mkdir` 命令用于创建目录，用法如下：

```txt
mkdir [option] <路径>
```

常用选项：

- -p：递归创建

例如创建 `video` 目录：

```bash
mkdir video
```

递归创建一系列文件夹：

```bash
mkdir one/two/three
```

## cp 命令

`cp` 命令可以复制一份文件或目录到指定的路径。语法如下：

```txt
cp [option] <文件路径> <目标路径>
```

选项说明：

- `-r`：递归复制目录及其内容（用于复制目录）。

- `-i`：交互模式，覆盖前提示用户确认。

- `-f`：强制复制，覆盖目标文件而不提示。

- `-v`：显示详细的复制过程（verbose）。

- `-p`：保留文件的原始属性（如权限、时间戳等）。

- `-a`：归档模式，等同于 `-dpr`，保留所有文件属性和递归复制目录。

- `-u`：仅当源文件比目标文件新时才复制（更新模式）。

- `-l`：创建硬链接而不是复制文件。

- `-s`：创建符号链接（软链接）而不是复制文件。

例如将 `/home/fovlin/file` 文件复制一份到到 `/home/fovlin/directory` 目录下：

```bash
cp /home/fovlin/file /root
```

复制当前工作目录下的 `directory` 目录到 `/home/fovlin/Documents` 目录下：

```bash
cp -r ./directory /home/fovlin/Documents
```

## rm 命令

`rm` 命令可以删除一个或多个文件或目录。

用法：

```txt
rm [option] <路径>
```

常见选项如下：

- -r：递归删除，删除目录时必需

- -f：强制删除，忽略不存在的文件且不提示

- -i：交互式删除，删除前逐一询问确认

删除单个文件：

```bash
rm file.txt
```

递归删除目录及其内容：

```bash
rm -rf dir/
```

交互式删除文件：

```bash
rm -i file.txt
```


## touch 命令

`touch` 命令用于创建空文件，或更新已有文件的时间戳。

用法：

```txt
touch [option] <路径>
```

常见选项如下：

- -c：不创建文件，仅更新时间戳

- -t：使用指定时间而非当前时间

创建一个空文件：

```bash
touch newfile.txt
```

同时创建多个文件：

```bash
touch file1.txt file2.txt file3.txt
```

仅更新文件时间戳，不创建：

```bash
touch -c existing.txt
```

## chmod 命令

使用 `ls -l` 命令时，会输出文件的基本信息，其中包含文件的权限信息：

```log
drwxr-xr-x  2 fovlin fovlin 4096  4月17日 00:37 docs
```

从左到右依次为：

---

`文件权限` `我也不知道是啥` `所有者` `所有组` `文件大小(不会显示目录大小)` `最后访问日期` `最后访问时间` `文件名称`

---

### 更改文件权限

文件权限 `drwxr-xr-x` 前一个字符表示文件类型，常见字符对应的文件类型如下：

- `-`: 普通文件

- `d`: 目录

- `l`: 链接

- `c`: 字符设备文件

- `b`: 块设备文件

- `s`: 套接字文件

- `p`: 管道文件

文件权限 `drwxr-xr-x` 第 2-4 、 5-7 、 8-10 个字符分别表示所有者权限、所有组权限、其他用户权限，三个字符分别代表：

- `r`: 读权限

- `w`: 写权限

- `x`: 执行权限

使用 `chmod` 可以改变文件权限，用法如下：

```txt
chmod [选项] <权限信息> <文件名>
```

> 当权限不足时可以使用超级管理员进行操作。

一般常用数字模式来表示权限：

- `x`: 1

- `w`: 2

- `r`: 4

将需要的权限对应的数字加和即可表示单个权限。

一个文件的权限信息由三位数字，也就是三个权限组成，分别表示所有者权限、所有组权限、其他用户权限。

例如将文件 script.sh 改为所有者可读可执行可写，同用户组可读可执行，其他用户仅执行，执行以下命令：

```bash
chmod 751 script.sh
```

将整个目录 docs 递归改为所有者可读可执行可写，同用户组可读可执行，其他用户仅执行，执行以下命令：

```bash
chmod -R 751 docs
```

> 可执行在目录中表示能否进入目录。

## chown 命令

`chown` 命令用于更改目文件的所有者，格式如下：

```txt
chown [option] <所有者|所有者:所属组> <文件路径>
```

- `-R`：--recursive，递归更改目录及其子目录中所有文件的所有者

- `-v`：--verbose，显示详细操作信息

- `-c`：--changes，只显示实际发生更改的文件

- `-f`：--silent, --quiet，抑制错误信息

- `--reference=文件`：使用参考文件的所有者和组设置

- `-h`：--no-dereference，影响符号链接本身，而不是链接指向的文件

- `--from=当前所有者`：只有当前所有者匹配时才更改

使用 `ls -l` 命令时，会输出文件的基本信息，其中包含文件的权限信息：

```log
drwxr-xr-x  2 root root 4096  4月17日 00:37 docs
```

`root root` 表示文件的所有者为 root，所属组为 root，更改此处的信息需要用到 `chown` 命令。

更改不属于自己的文件的操作需要管理员权限，例如更改当前目录下 root 用户的 `docs` 目录的所有者，以及所属组为 fovlin：

```bash
sudo chown -R fovlin:fovlin docs
```

## nano 命令

`nano` 是编辑含文本文件内容的一个工具，直接使用 `nano <文件路径>` 即可开始编辑文件。

开始编辑后，会进入交互式命令行模式，常用快捷键如下：

- `Ctrl + G`：帮助

- `Ctrl + O`：写入文件

- `Ctrl + F`：搜索字符串

- `Ctrl + K`：剪切

- `Ctrl + T`：执行命令

- `Ctrl + X`：离开

- `Ctrl + R`：读档

- `Ctrl + \`：替换

- `Ctrl + U`：粘贴

- `Ctrl + J`：对齐

编辑操作不是实时的，在退出前需要先 `Ctrl + O` 写入文件，再退出，才能够完成对文件的编辑。

诸如此类的工具还有 `vim` `neovim` 等。