Linux 系统编程(三):从文件移动到文本查看|mv、cat、less、head、tail 与时间命令
本文是《Linux 系统编程》系列第三篇,承接上一篇目录树、路径与基础文件操作内容。本篇从 mv 文件移动与重命名讲起,依次介绍 cat、more、less、head、tail 等文本查看工具,讲解输入输出重定向与管道核心思想,最后学习 date 时间格式化、Unix 时间戳与 cal 日历命令。文中搭配大量实操示例,区分各命令适用场景,演示管道组合命令的思路。不只是单纯罗列指令,重点理解 Shell 输入输出模型,为后续文件检索、系统编程打下基础。
写在前面
在上一篇《Linux系统编程(二):从目录树到命令执行|路径、环境变量、alias 与文件操作入门》中,我们学习了 Linux 的目录结构、绝对路径与相对路径、常用文件操作,以及 Shell 命令的执行方式。
通过前面的学习,我们已经可以在终端中定位文件、创建目录、复制文件,并利用 man 查询命令的帮助信息。
但日常使用 Linux 时,我们还会遇到更多问题:
- 文件创建好了,应该怎样重命名或移动到其他目录?
- 文件中有大量内容,怎样快速查看,而不是一次性全部输出?
- 如何只查看文件的前几行或最后几行?
- 如果想查看日志文件不断追加的新内容,应该使用什么命令?
- 怎样将一个命令的输出保存到文件,或者将多个命令连接起来?
- 如何在终端中查看日期、时间和日历?
这些问题分别涉及文件移动、文本查看、输入输出重定向、管道以及时间管理等知识。
本篇继续按照 Linux 基础指令的学习顺序,从 mv 开始,逐步学习这些命令及其实际用途。
一、mv:移动文件与重命名
1.1 mv 命令的基本作用
mv 是 Linux 中用于移动文件或目录,以及重命名文件或目录的命令。它的名称来自英文单词 move。
基本语法:
mv [选项] 源文件或目录 目标文件或目录
mv 有两个主要用途:
- 当目标是一个新的文件名时,可以对文件或目录进行重命名。
- 当目标是一个已存在的目录时,可以将文件或目录移动到该目录中。
1.2 重命名文件
假设当前目录中有一个名为 myfile.txt 的文件,现在希望将它重命名为 yourfile.txt。
mv myfile.txt yourfile.txt
执行后,可以使用 ls 查看当前目录:
ls
如果原文件不再出现,而新文件名出现在列表中,说明重命名操作已经完成。
需要注意,重命名并不会改变文件的实际内容。它改变的是文件在目录中的名称。
1.3 移动文件
假设当前目录中有一个 myfile.txt,同时存在一个名为 temp 的目录。
可以执行:
mv myfile.txt temp/
这条命令会将文件移动到 temp 目录中。
查看移动结果:
ls
ls temp/
第一条命令查看当前目录,第二条命令查看 temp 目录中的内容。
如果目标目录不存在,而你希望将文件改成这个目录名称,那么命令可能会被解释为重命名操作。因此,使用 mv 时需要分清目标究竟是目录,还是新的文件名。
1.4 移动目录
mv 同样可以移动整个目录。
例如:
mv temp ../
这条命令会将当前目录下的 temp 移动到上一级目录。
其中,.. 表示上一级目录,具体含义与上一篇介绍的路径规则一致。
对于同一文件系统中的移动操作,通常不需要逐个复制目录中的文件;但跨文件系统移动时,底层可能需要通过复制和删除来完成。
1.5 常用选项
| 选项 | 作用 |
|---|---|
| -i | 当目标位置存在同名文件时,询问是否覆盖 |
| -f | 强制执行,不进行交互式覆盖询问 |
例如:
mv -i yourfile.txt myfile.txt
如果目标文件已经存在,系统会提示是否覆盖。确认后再输入 y。
使用 -f 时:
mv -f yourfile.txt myfile.txt
需要特别注意,覆盖可能导致原目标文件的数据丢失。处理重要文件时,建议优先使用 -i,并在操作前检查目标路径。
二、cat:查看文件内容
2.1 cat 命令的基本作用
cat 是一个常用的文件内容查看命令,也可以将多个文件的内容连接后输出。
基本语法:
cat [选项] [文件名]
查看文件内容:
cat myfile.txt
终端会直接显示文件内容。
如果文件只有几行,这种方式非常方便。但如果文件有几千行甚至更多,所有内容一次性输出就不太适合阅读。
因此,cat 更适合查看较短的文本文件。对于大型日志文件或配置文件,可以使用后面介绍的 less、head 和 tail。
2.2 使用 cat 显示行号
cat 有两个容易混淆的选项:-n 和 -b。
使用 -n:
cat -n myfile.txt
该选项会为输出的所有行添加行号,包括空行。
使用 -b:
cat -b myfile.txt
该选项只为非空行添加行号,空行不编号。
例如,文件内容如下:
Linux
Command
执行 cat -n 时,空行也会占据一个行号;执行 cat -b 时,空行则不会获得行号。
这两个选项的区别,在查看格式化文本或需要定位具体内容时比较有用。
2.3 使用 -s 处理连续空行
如果文件中出现了多个连续空行,可以使用:
cat -s myfile.txt
-s 可以将连续的空行压缩为一个空行输出。
需要注意,这只是输出时的显示效果,不会直接修改原文件中的内容。
2.4 cat 的使用边界
cat 的优点是简单、直接,适合快速检查文件内容。
但对于很长的文件,它不具备 less 那样方便的翻页和搜索能力。因此,我们不应当把所有文本查看任务都交给 cat。
接下来介绍的 more 和 less,就是为分页阅读文件提供的工具。
三、more 与 less:分页查看文件
3.1 为什么需要分页查看?
假设一个文件中有两千行内容。
如果直接执行:
cat temp.txt
终端会输出大量文本,前面的内容可能很快滚出当前屏幕。
这时,我们通常希望一次只阅读一部分内容,并根据需要继续向后或向前查看。
more 和 less 都可以用于分页浏览文本,但两者在操作灵活性方面存在区别。
3.2 more:逐页查看文本
基本语法:
more [选项] 文件名
例如:
more temp.txt
命令会按屏幕容量逐页显示文件内容。
如果想调整每页显示的行数,可以使用:
more -10 temp.txt
这里的 10 表示每页显示的行数设置。不同实现的具体交互细节可能存在差异。
浏览过程中,可以按 q 退出。
more 适合顺序阅读较长的文件,但它的翻页和搜索能力相对有限。
3.3 less:更加灵活的分页查看工具
less 的基本语法是:
less [选项] 文件名
例如:
less temp.txt
与 more 相比,less 更适合需要反复浏览、向前翻页以及搜索文本的场景。
常用选项和操作如下:
| 选项或按键 | 作用 |
|---|---|
| -i | 搜索时忽略大小写差异 |
| -N | 显示行号 |
| /字符串 | 向下搜索指定字符串 |
| ?字符串 | 向上搜索指定字符串 |
| n | 重复上一次搜索,沿原搜索方向继续 |
| N | 反向重复上一次搜索 |
| q | 退出 |
例如:
less -N temp.txt
这条命令会显示行号,方便定位内容。
进入文件后,输入:
/hello
即可向下搜索 hello。
如果输入:
?hello
则可以向上搜索。
搜索完成后,可以通过 n 和 N 在匹配结果之间切换。
3.4 more 和 less 应该怎样选择?
两者都适合查看较长的文本文件,但如果需要反复定位内容、向前翻页或者搜索关键字,通常更推荐 less。
可以简单理解为:
- cat:快速输出文件内容。
- more:按页向后浏览。
- less:更灵活地翻页、搜索和定位。
这并不意味着 cat 已经过时。它仍然非常适合查看短文件,也经常用于后续学习的命令组合。
四、head:查看文件开头
4.1 基本用法
head 用于查看文件开头的一部分内容。
基本语法:
head [选项] 文件名
直接执行:
head temp.txt
默认情况下,head 输出文件开头的 10 行。
如果只需要前 5 行,可以使用:
head -n 5 temp.txt
这样就只会输出前 5 行。
4.2 head 的使用场景
例如,一个程序生成了很长的日志文件,我们只想确认日志开头是否包含初始化信息,就可以执行:
head -n 20 app.log
这样可以快速查看文件前 20 行,而不必输出整个文件。
如果想查看配置文件的开头、数据文件的前几条记录,或者检查生成文件的基本内容,head 都很实用。
五、tail:查看文件末尾与动态日志
5.1 基本用法
tail 与 head 的用途相对应,主要用于查看文件末尾的内容。
基本语法:
tail [选项] 文件名
例如:
tail temp.txt
默认输出文件最后 10 行。
如果只想查看最后 3 行:
tail -n 3 temp.txt
这样就能快速查看文件末尾的内容。
5.2 使用 -f 查看不断更新的文件
tail 有一个非常实用的选项:-f。
tail -f app.log
这个命令会持续显示文件末尾新增的内容。
例如,程序运行时不断向 app.log 写入日志,我们就可以打开一个终端执行 tail -f app.log,观察程序运行过程中产生的新日志。
当文件有新的内容追加时,终端会继续显示这些内容。按 Ctrl+C 可以停止当前查看操作。
这在服务器维护、程序调试和日志排查中非常有用。
需要注意,tail -f 主要关注文件末尾新增的内容,并不是对整个文件进行持续重新读取。某些程序会通过替换日志文件而不是追加内容来更新日志,这种情况下可能需要考虑其他跟踪方式。
5.3 综合示例:查看指定范围的行
现在考虑一个实际问题:
如果一个文件有很多行,我们只想查看第 181 行到第 200 行,应该怎么办?
可以使用:
head -200 temp.txt | tail -20
这条命令结合了前面学过的 head、tail,以及一个新的操作符:管道 |。
执行过程如下:
- head -200 temp.txt 先取出文件开头的 200 行。
- | 将前一个命令的输出传递给后一个命令。
- tail -20 再从这 200 行中取出最后 20 行。
最终得到的就是原文件的第 181~200 行。
如果文件的每一行分别是 hello 0、hello 1、hello 2……,那么结果会从 hello 180 开始,到 hello 199 结束。
这个示例非常重要,因为它展示了 Linux 命令的一种常见思想:不必为每个需求寻找一个全新的命令,而是可以把已有命令组合起来解决问题。
六、输入输出重定向:将命令结果保存到文件
前面介绍的命令主要将结果显示在终端中。但在实际使用 Linux 时,我们经常需要将命令结果保存下来,供后续查看或处理。
例如:
- 将命令执行结果保存为日志。
- 将多次运行的结果追加到同一个文件。
- 从已有文件中读取内容。
- 将一个命令的输出传递给另一个命令。
这就涉及 Shell 的输入输出重定向和管道。
6.1 什么是输出重定向?
通常情况下,命令的标准输出会显示在终端中。
使用 >,可以将标准输出重定向到文件。
例如:
echo "Hello Linux" > output.txt
执行后,文本会被写入 output.txt,而不是直接显示在终端中。
如果目标文件不存在,Shell 会创建该文件;如果目标文件已经存在,通常会先清空原有内容,再写入新的输出。
因此,使用 > 时必须注意,它可能覆盖原有文件内容。
6.2 使用 >> 追加内容
如果不希望覆盖已有内容,而是想将新内容追加到文件末尾,可以使用 >>。
例如:
echo "First line" > output.txt
echo "Second line" >> output.txt
第一条命令创建或覆盖文件并写入第一行,第二条命令则在文件末尾追加第二行。
查看结果:
cat output.txt
输出内容为:
First line
Second line
两种重定向方式的区别如下:
| 符号 | 作用 | 对已有文件的影响 |
|---|---|---|
| > | 输出重定向 | 通常先清空原内容 |
| >> | 追加重定向 | 保留原内容并追加 |
这是 Linux 命令行中非常基础、也非常重要的操作。
6.3 输入重定向
与输出重定向相对应,< 可以将文件内容作为命令的标准输入。
例如:
cat < output.txt
这里没有直接给 cat 指定文件名,而是通过输入重定向,让它从标准输入读取 output.txt 的内容。
对于 cat 这样的命令,这种写法在效果上与直接执行 cat output.txt 类似,但它展示了 Shell 输入重定向的基本原理。
后续学习 Shell 脚本、数据处理和自动化操作时,这种机制会发挥更大的作用。
七、管道:将多个命令连接起来
7.1 管道的基本概念
管道符号是:
|
它可以将前一个命令的标准输出,作为后一个命令的标准输入。
基本结构:
命令1 | 命令2
例如:
ls -l | less
左侧的 ls -l 输出目录内容,右侧的 less 接收这些内容并进行分页显示。
当目录中有大量文件时,这种方式比一次性输出全部结果更方便。
7.2 管道与重定向的区别
重定向和管道都涉及命令输入输出,但用途并不相同。
- 重定向主要用于将输入或输出连接到文件。
- 管道主要用于将一个命令的输出传递给另一个命令。
例如:
ls -l > files.txt
这是将目录列表保存到文件。
而:
ls -l | less
则是将目录列表交给 less 分页查看。
理解这一区别后,我们就能逐步将简单命令组织成更复杂的操作流程。
7.3 回顾综合案例
再次看一下之前的命令:
head -200 temp.txt | tail -20
这个例子不需要编写额外程序,就能从一个很长的文件中提取指定范围的行。
它说明 Linux 命令行并不只是把一个个命令孤立地执行,而是可以通过标准输入、标准输出和管道构建灵活的数据处理流程。
八、date:查看与格式化时间
8.1 查看当前日期和时间
date 用于显示系统日期和时间,也可以按照指定格式输出时间信息。
最简单的用法是:
date
执行后,终端会显示当前系统时间。
如果希望以更适合程序记录或日志处理的形式输出日期,可以使用格式参数。
8.2 自定义日期格式
例如:
date +%Y-%m-%d
可以输出类似下面的格式:
2026-10-18
如果希望同时显示日期和具体时间,可以使用:
date '+%Y-%m-%d %H:%M:%S'
常见格式符如下:
| 格式符 | 含义 |
|---|---|
| %H | 小时,24 小时制 |
| %M | 分钟 |
| %S | 秒 |
| %X | 本地时间的常用表示形式 |
| %d | 日期中的日 |
| %m | 月份 |
| %Y | 完整年份 |
| %F | 等价于 %Y-%m-%d |
例如:
date +%Y/%m/%d
可以输出以斜杠分隔的日期。
而:
date '+%Y/%m/%d-%H:%M:%S'
则可以将日期和时间组合起来。
这里需要注意,date 的输出会受到系统时区和本地化设置等因素影响,因此不同环境中的显示结果可能不完全相同。
8.3 Unix 时间戳
在程序开发中,除了人类容易阅读的日期格式,还经常使用 Unix 时间戳。
可以执行:
date +%s
获取当前时间对应的 Unix 时间戳。
Unix 时间戳通常表示自 1970 年 1 月 1 日 UTC 零点起经过的秒数,不考虑闰秒。
如果希望将某个时间戳转换为可读时间,可以使用:
date -d @0
例如:
date +%Y/%m/%d-%H:%M:%S -d @0
在采用 UTC+8 时区的环境中,结果通常会显示为:
1970/01/01-08:00:00
这是因为时间戳对应的是 UTC 时间,而命令默认按照本地时区显示。
在日志分析、程序运行记录、时间差计算等场景中,时间戳都很有用。
8.4 设置系统时间
date 也提供了设置系统时间的方式,例如:
date -s "2026-01-01 12:00:00"
该操作需要相应的系统权限。实际执行时,应根据目标系统的时间同步机制和管理方式进行操作。
学习时了解语法即可,不要在真实服务器上随意修改系统时间。 系统时间变化可能影响日志排序、证书校验、定时任务和其他依赖时间的服务。
生产环境通常还需要考虑 NTP 等时间同步机制,不能只把修改系统时间当作普通的文本操作。
九、cal:查看日历
9.1 基本用法
cal 用于显示公历日历。
直接执行:
cal
通常会显示当前月份的日历。
如果想查看指定年份的日历,可以执行:
cal 1949
这样就能查看 1949 年的日历。
9.2 常用选项
| 选项 | 作用 |
|---|---|
| -3 | 显示上个月、当前月和下个月 |
| -y | 显示当前年份的日历 |
| -j | 显示一年中的第几天,而不是普通月内日期 |
例如:
cal -3
可以同时查看连续三个月的日历。
执行:
cal -y
则可以显示当前年份的日历。
如果想查看一年中的第几天,可以执行:
cal -j
这时显示的是从当年 1 月 1 日开始累计的日序号,而不是普通日历中的日期数字。
需要注意,不同 Linux 发行版的默认安装情况可能有所不同。如果出现 cal: command not found,需要检查当前系统是否安装了提供该命令的软件包。
十、本篇常用命令速查
为了方便后续复习,可以把本篇涉及的命令整理成下面这张表。
| 命令 | 主要用途 | 示例 | ||
|---|---|---|---|---|
| mv | 移动或重命名文件 | mv old.txt new.txt | ||
| cat | 查看文件内容 | cat -n file.txt | ||
| more | 分页浏览文件 | more file.txt | ||
| less | 灵活翻页和搜索 | less -N file.txt | ||
| head | 查看文件开头 | head -n 5 file.txt | ||
| tail | 查看文件末尾 | tail -n 5 file.txt | ||
| tail -f | 持续查看新增日志 | tail -f app.log | ||
| > | 输出重定向 | echo "text" > file.txt | ||
| >> | 追加输出 | echo "text" >> file.txt | ||
| \ | 连接命令输出与输入 | ls -l \ | less | |
| date | 查看和格式化时间 | date '+%F %T' | ||
| cal | 查看日历 | cal -3 |
十一、总结
本篇在前面已经掌握的目录、路径和基础文件操作之上,继续介绍了文件移动、文本查看、命令组合与时间信息。
通过 mv,我们可以移动和重命名文件;通过 cat、more、less、head 和 tail,我们能够根据文件大小和查看需求选择合适的工具。
输入输出重定向让命令结果可以保存到文件,管道则使多个命令能够相互配合。最后,date 和 cal 进一步补充了日常使用 Linux 时经常需要的时间与日历操作。
这些命令看起来都很简单,但它们共同构成了 Linux 命令行的基础。真正重要的不是机械记住每个命令的参数,而是理解命令的输入、输出和使用场景,并逐渐学会组合已有工具解决问题。
下一篇将继续按照 Linux 基础指令的学习顺序,进入文件查找、命令定位与文本检索,重点学习 find、whereis 和 grep,并衔接后续的系统状态查看命令。