← 返回文章列表

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,并衔接后续的系统状态查看命令。