# 1.2 文件管理类命令

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

在处理 Linux 文件时注意：

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

## 手册与命令类型查询

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

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

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

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

* 把已存在文件的时间标签更新为系统当前的时间（默认方式），它们的数据将原封不动地保留下来；
* <mark style="color:$success;">创建新的空文件</mark><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 -a` 的别名，别名的配置方法参见[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
chown groupname filename
```

## 压缩

**zip命令** 可以用来解压缩文件，或者对文件进行打包操作。`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）**&#x7528;来为文件创建链接，链接类型分为硬链接和符号链接两种，默认的链接类型是硬链接。如果要创建软链接必须使用 `-s` 选项。

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

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

{% hint style="success" %}
软链接，是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上，它只是一个文本文件，其中包含它提供链接的另一个文件的路径名。另一个文件是实际包含所有数据的文件。所有读、写文件内容的命令被用于符号链接时，将沿着链接方向前进来访问实际的文件。<mark style="color:$success;">所以建议使用软连接</mark><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）用于<mark style="color:purple;">显示文件系统的磁盘空间利用情况</mark>。当在终端中运行 `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）也是查看使用空间的，但是与 `df` 命令不同的是 `du` 命令是对<mark style="color:purple;">文件和目录磁盘使用的空间的查看</mark>。<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）**&#x7528;来将一个或多个源文件或者目录复制到指定的目的文件或目录。`cp` 命令支持同时复制多个文件，<mark style="color:$danger;">**当一次复制多个文件时，目标文件参数必须是一个已经存在的目录，否则将出现错误。**</mark>

**mv命令（move file）**&#x5E38;用来对文件或目录重新命名，或者将文件从一个目录移到另一个目录中。如果将一个文件移到一个已经存在的目标文件中，则目标文件的内容将被覆盖。

`mv` 命令可以用来将源文件移至一个目标文件中，或将一组文件移至一个目标目录中。源文件被移至目标文件有两种不同的结果：

* 如果目标文件是到某一目录文件的路径，源文件会被移到此目录下，且文件名不变。
* 如果目标文件不是目录文件，则源文件名（只能有一个）会变为此目标文件名，并覆盖己存在的同名文件。如果源文件和目标文件在同一个目录下，`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` 也支持直接用别名。

```
# 把本地的 /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）。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://s-klnw.gitbook.io/study-manual/0.-linux-commands/1.2-wen-jian-guan-li-lei-ming-ling.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
