> For the complete documentation index, see [llms.txt](https://s-klnw.gitbook.io/study-manual/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://s-klnw.gitbook.io/study-manual/0.-linux-commands/1.2-wen-jian-guan-li-lei-ming-ling.md).

# 1.2 文件管理类命令

{% hint style="info" %}
**写在前面**

在处理 Linux 文件时需注意：

1. Linux 对文件后缀不严格限制
2. Linux 对大小写是敏感的
3. 标准的 Linux 文件，路径名长度(包含所有字符) 不可超过 `4096` 字节
4. 路径名中通过 / 分隔开的每一部分的长度不可超过 `255` 字节
   {% endhint %}

## 手册与命令类型查询

**man命令**（manual）显示手册页，通过阅读手册了解命令的使用如：`man ls`。

* `[ ]`（方括号）：代表可选选项。例如 `[--color]`，意味用户是否使用这个选项，命令都能运行。
* `< >`（尖括号）：代表必填选项。用户必须在后面传入具体的文件名、路径或数值。
* `|`（竖线）：代表互斥（多选一）。例如 `a|b` 意味着用户只能在 `-a` 和 `-b` 选项中选择一个。
* `...`（省略号）：代表可以同时传入多个同类选项。例如 `ls [FILE]...` 意味着用户可以一次性查看多个文件。
* 按 `q` 键退出手册。

**type命令** 判断命令是可执行文件、shell 内置命令还是别名，`type` 的使用方法参考 [1.4 Linux 命令附录](/study-manual/0.-linux-commands/1.4-linux-ming-ling-fu-lu.md#type-ming-ling-xian-shi-ming-ling-lei-xing)。

## **新建文件 / 目录**

**touch命令** 有两个功能：

* 把已存在文件的时间标签更新为系统当前的时间（默认方式），它们的数据将原封不动地保留下来；
* <mark style="color:$success;">创建新的空文件。</mark>

**mkdir命令**（make directory）用来创建目录。e.g.

{% tabs %}
{% tab title="创建文件" %}

```bash
[zhangzh@node01 ~]$ touch lab
[zhangzh@node01 ~]$ ll
total 4
-rw-r--r-- 1 zhangzh ybj 0 May 9 12:09 lab
drwx------ 2 zhangzh ybj 4096 May 8 16:17 linux
```

{% endtab %}

{% tab title="创建目录" %}

```bash
[zhangzh@node01 ~]$ mkdir lab
[zhangzh@node01 ~]$ ll
total 8
drwxr-xr-x 2 zhangzh ybj 4096 May 9 12:10 lab
drwx------ 2 zhangzh ybj 4096 May 8 16:17 linux
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
`ll` 是 `ls -l` 的别名，别名的配置方法参见 [1.1 系统管理类命令](/study-manual/0.-linux-commands/1.1-xi-tong-guan-li-lei-ming-ling.md#pei-zhi-bie-ming)。
{% endhint %}

<mark style="color:$danger;">不要把所有的文件都存放在主目录中。通过创建子目录来更有效地整理文件，最好采用前后一致的命名方式来区分文件和目录。</mark>

## 权限

Linux 系统中，文件权限表示方法有字母和数字两种，终端中输入 `ll` 就能看到文件权限：

```
rw-/r--/r-- 分别指u:用户权/g:组权限/o:其他人权限
r 指读权限 read，数值表示为 4
w 指写权限 write，数值表示为 2
x 指执行权限 execute，数值表示为 1
上面的文件权限是：用户可读可写，不可执行，组员可读，不可写和执行，其他用户可读，不可写和执行。
数字表示法为 644，即：4+2，4，4
```

**chmod命令（change mode）**&#x7528;来变更文件或目录的权限。

```
参数说明（部分）：
-v：显示权限变更的详细资料。
-R：对目前目录下的所有文件与子目录进行相同的权限变更（即以递归的方式逐个变更）。
```

<details>

<summary>e.g. 修改文件权限</summary>

```bash
[zhangzh@node01 ~]$ ll
total 0
-rw-r--r-- 1 zhangzihao lhaaso 0 Oct 12 09:59 lab1.txt
-rw-r--r-- 1 zhangzihao lhaaso 0 Oct 12 09:59 lab2.txt
-rw-r--r-- 1 zhangzihao lhaaso 0 Oct 12 09:59 lab3.txt
-rw-r--r-- 1 zhangzihao lhaaso 0 Oct 12 09:59 lab4.txt
-rw-r--r-- 1 zhangzihao lhaaso 0 Oct 12 09:59 lab5.txt
[zhangzh@node01 ~]$ chmod 700 lab1.txt 
[zhangzh@node01 ~]$ chmod 755 lab2.txt 
[zhangzh@node01 ~]$ chmod 777 lab3.txt 
[zhangzh@node01 ~]$ chmod g+x lab4.txt    # 添加组执行
[zhangzh@node01 ~]$ chmod o-r lab5.txt    # 拒绝他人读
[zhangzh@node01 ~]$ ll
total 0
-rwx------ 1 zhangzihao lhaaso 0 Oct 12 09:59 lab1.txt
-rwxr-xr-x 1 zhangzihao lhaaso 0 Oct 12 09:59 lab2.txt
-rwxrwxrwx 1 zhangzihao lhaaso 0 Oct 12 09:59 lab3.txt
-rw-r-xr-- 1 zhangzihao lhaaso 0 Oct 12 09:59 lab4.txt
-rw-r----- 1 zhangzihao lhaaso 0 Oct 12 09:59 lab5.txt
```

</details>

**chown命令**（change owner）变更文件所有人。

```bash
chown username filename
chown username:groupname filename
```

**chgrp命令**（change group）仅变更组。

```bash
chgrp groupname filename
```

## 压缩

**zip命令** 用来压缩和解压缩文件。文件经它压缩后会另外产生具有 `.zip` 扩展名的压缩文件。

压缩和解压缩文件的语法分别是 `zip filename` 和 `unzip filename`。

```
参数说明（部分）：
-L：显示版权信息。
-r：递归压缩，将指定目录及其子目录一并处理。
-m：压缩后删除源文件，及将文件移动至压缩包内。
```

<details>

<summary>e.g. 压缩及解压实例</summary>

```bash
[zhangzh@node01 ~]$ zip root.zip root.txt
[zhangzh@node01 ~]$ zip -r root.zip root/ 
[zhangzh@node01 ~]$ unzip root.zip
```

</details>

**zcat命令** 显示压缩格式文件内容的工具。

## 查找

**find命令** 用来在指定目录下查找文件。支持正则表达。e.g.

{% tabs %}
{% tab title="严格大小写查找" %}

```bash
[zhangzh@node01 tutorials]$ pwd
/home/users/z/zhangzh/guide/root/tutorials
[zhangzh@node01 tutorials]$ find /home/users/z/zhangzh/guide/root/tutorials/ -name latex4.C
/home/users/z/zhangzh/guide/root/tutorials/graphics/latex4.C
```

{% endtab %}

{% tab title="忽略大小写查找" %}

```bash
$ find /home -iname "*.txt"
```

{% endtab %}

{% tab title="基于正则表达查找" %}

```bash
find . -regex ".*\(\.txt\|\.pdf\)$"
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**pwd命令**（print work directory）可以打印出当前的工作目录。
{% endhint %}

## 比较

**diff命令** 在最简单的情况下，比较给定的两个文件的不同。如果使用 `-` 代替「文件」参数，则要比较的内容将来自标准输入。`diff` 命令是以逐行的方式，比较文本文件的异同处。如果该命令指定进行目录的比较，则将会比较该目录中具有相同文件名的文件，而不会对其子目录文件进行任何比较操作。

<details>

<summary>e.g. 比较 <code>.bashrc</code> 与 <code>lab1</code> 的差异</summary>

```bash
[zhangzh@node01 ~]$ diff .bashrc lab1
1,20d0
< # .bashrc
< 
< # Source global definitions
< if [ -f /etc/bashrc ]; 
< then
<     . /etc/bashrc 
< fi
< 
< # User specific environment
< if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
< then
<     PATH="$HOME/.local/bin:$HOME/bin:$PATH"
< fi
< export PATH
< 
< #ROOT environment
< source /home/software/cern_root/root_install/bin/thisroot.sh
< 
< #alias
< alias cl='clear'
```

</details>

## 链接

Linux 具有为一个文件创建多个访问入口的功能，称为链接。被链接的文件可以存放在相同的目录下，但是必须有不同的文件名，而不用在硬盘上为同样的数据重复备份。

**ln命令（link file）** 用来为文件创建链接，链接类型分为硬链接和符号链接两种，默认的链接类型是硬链接。如果要创建软链接必须使用 `-s` 选项。

{% hint style="danger" %}
硬连接指通过索引节点来进行连接。

在 Linux 的文件系统中，保存在磁盘分区中的文件不管是什么类型都给它分配一个编号，称为索引节点号（Inode Index）。多个文件名指向同一索引节点是存在的，一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名，这样用户就可以建立硬连接到重要文件，以防止「误删」的功能。其原因如上所述，因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接，只有当最后一个连接被删除后，文件的数据块及目录的连接才会被释放。也就是说，文件真正删除的条件是与之相关的所有硬连接文件均被删除。
{% endhint %}

{% hint style="success" %}
软链接，是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上，它只是一个文本文件，其中包含它提供链接的另一个文件的路径名。另一个文件是实际包含所有数据的文件。所有读、写文件内容的命令被用于符号链接时，将沿着链接方向前进来访问实际的文件。<mark style="color:$success;">所以建议使用软连接。</mark>
{% endhint %}

e.g. **链接实例**

```bash
[zhangzh@node01 ~]$ ll
total 4
drwx------ 2 zhangzh ybj 4096 May  8 16:17 linux
[zhangzh@node01 ~]$ ln -s /usr/bin/ wpbin
[zhangzh@node01 ~]$ ll
total 4
drwx------ 2 zhangzh ybj 4096 May  8 16:17 linux
lrwxrwxrwx 1 zhangzh ybj    9 May  9 14:37 wpbin -> /usr/bin/
[zhangzh@node01 ~]$ rm wpbin
[zhangzh@node01 ~]$ ll
total 4
drwx------ 2 zhangzh ybj 4096 May  8 16:17 linux
```

## 统计

#### 内存统计

**df命令**（disk free）显示文件系统的磁盘空间利用情况。

当在终端中运行 `df` 命令时，它会列出系统中所有的文件系统及其对应的磁盘空间使用情况，包括磁盘总容量、已用空间、可用空间以及挂载点等信息。这个命令对于了解系统中磁盘空间的使用情况非常有用。建议使用 `-h` 选项使之易读。

```bash
MacBook-Pro:plot zhangzh$ df -h
Filesystem       Size   Used  Avail Capacity iused      ifree %iused  Mounted on
/dev/disk3s1s1  460Gi  8.2Gi  339Gi     3%  348619 3553790160    0%   /
devfs           199Ki  199Ki    0Bi   100%     689          0  100%   /dev
/dev/disk3s6    460Gi   20Ki  339Gi     1%       0 3553790160    0%   /System/Volumes/VM
/dev/disk3s2    460Gi  4.1Gi  339Gi     2%     165 3553790160    0%   /System/Volumes/Preboot
/dev/disk3s4    460Gi  2.4Mi  339Gi     1%      14 3553790160    0%   /System/Volumes/Update
/dev/disk1s2    500Mi  6.0Mi  481Mi     2%       1    4925080    0%   /System/Volumes/xarts
/dev/disk1s1    500Mi  6.1Mi  481Mi     2%      21    4925080    0%   /System/Volumes/iSCPreboot
/dev/disk1s3    500Mi  2.2Mi  481Mi     1%      68    4925080    0%   /System/Volumes/Hardware
/dev/disk3s5    460Gi  108Gi  339Gi    25% 1308052 3553790160    0%   /System/Volumes/Data
map auto_home     0Bi    0Bi    0Bi   100%       0          0  100%   /System/Volumes/Data/home
```

**du命令**（disk usage）查看文件和目录磁盘的使用空间。

<mark style="color:$success;">常用命令是</mark> <mark style="color:$success;">`du -sh`</mark> <mark style="color:$success;">和</mark> <mark style="color:$success;">`du -h`</mark><mark style="color:$success;">，前者可以查看当前目录下所有文件大小的总和，后者可以列出当前目录下所有文件的大小。</mark>

<details>

<summary>e.g. 常用选项和实例</summary>

```bash
[zhangzh@node01 ~]$ ll
total 4
-rw-r--r-- 1 zhangzh ybj    0 May  9 14:54 lab1
-rw-r--r-- 1 zhangzh ybj    0 May  9 14:54 lab2
-rw-r--r-- 1 zhangzh ybj    0 May  9 14:54 lab3
-rw-r--r-- 1 zhangzh ybj    0 May  9 14:54 lab4
-rw-r--r-- 1 zhangzh ybj    0 May  9 14:54 lab5
drwx------ 2 zhangzh ybj 4096 May  8 16:17 linux
[zhangzh@node01 ~]$ du -sh ~/linux/
12K    /home/users/z/zhangzh/linux/
[zhangzh@node01 ~]$ du -sh
108K    .
[zhangzh@node01 ~]$ du -sh *
0    lab1
0    lab2
0    lab3
0    lab4
0    lab5
12K    linux
[zhangzh@node01 ~]$ du -sh ~/linux/
12K    /home/users/z/zhangzh/linux/
```

</details>

#### 文本统计

**wc命令** 计算文件的 Byte 数、字数（使用 `-w` 选项)、或是行数（使用 `-l` 选项）。

## 复制/移动/重命名/删除

**cp命令（copy file）** 将一个或多个文件或者目录复制到指定的文件或目录中。

<mark style="color:$danger;">**当一次复制多个文件时，目标文件参数必须是一个已经存在的目录，否则将出现错误。**</mark>

**mv命令（move file）** 对文件或目录重命名，或者将文件从一个目录移到另一个目录中。

如果将一个文件移到一个已经存在的目标文件中，则目标文件的内容将被覆盖。

* 如果目标文件是到某一目录文件的路径，源文件会被移到此目录下，且文件名不变。
* 如果目标文件不是目录文件，则源文件名（只能有一个）会变为此目标文件名，并覆盖己存在的同名文件。如果源文件和目标文件在同一个目录下，`mv` 的作用就是改文件名。当目标文件是目录文件时，源文件或目录参数可以有多个，则所有的源文件都会被移至目标文件中。所有移到该目录下的文件都将保留以前的文件名。

`mv` 与 `cp` 的结果不同，`mv` 好像「搬家」，文件个数并未增加。而 `cp` 对文件复制，文件个数增加了。

**语法：**`source` 表示源文件或目录，`target` 表示目标文件或目录。

```shell
[zhangzh@node01 ~]$ cp [source] [target]                 # 复制，不含属性
[zhangzh@node01 ~]$ cp [source] [target/]                # 复制到其他目录，不含属性
[zhangzh@node01 ~]$ cp [source] [target/newfilename]     # 复制到其他，并改名，不含属性
[zhangzh@node01 ~]$ cp -a [source] [target]              # 复制，包含属性
[zhangzh@node01 ~]$ cp -r [source/] [target/]            # 复制目录/文件
[zhangzh@node01 ~]$ cp -r [source/] [target/newfilename] # 复制目录/文件，并改名
[zhangzh@node01 ~]$ cp -r [source/*] [target/]           # 复制文件下的文件
[zhangzh@node01 ~]$ mv [source] [target]                 # 同目录下移动 = 修改名称
[zhangzh@node01 ~]$ mv [source/] [target/]               # 不同目录下移动 = 剪切
```

#### **跨服务器传文件**

在两台服务器之间传输文件可以使用 **`scp` 命令**，它的地址格式与 `ssh` 基本相同，稍微的差别是指定端口时选项 `-P` 是大写。**`scp` 与 `ssh`** 一样支持「别名」。

```
# 把本地的 /path/to/local/file 文件传输到远程的 /path/to/remote/file
scp -P port /path/to/local/file user@remote:/path/to/remote/file

# 也可以使用别名
scp /path/to/local/file lab:/path/to/remote/file

# 把远程的 /path/to/remote/file 下载到本地的 /path/to/local/file
scp lab:/path/to/remote/file /path/to/local/file

# 远程的默认路径是家目录
# 下面命令把当前目录下的 file 传到远程的 ~/dir/file
scp file lab:dir/file

# 加上 -r 命令可以传送文件夹
# 下面命令可以把当前目录下的 dir 文件夹传到远程的家目录下
scp -r dir lab:

# 别忘了 . 可以用来指代当前目录
# 下面命令可以把远程的 ~/dir 目录下载到当前目录里面
scp -r lab:dir/ .
```

**rm命令**（remove file）删除文件。删除目录的时候需要使用 `rm -r` （递归）选项，或者使用 **rmdir命令**（Remove directory）。
