云计算百科
云计算领域专业知识百科平台

Linux 基础指令(二):文件复制移动、内容查看、时间管理与命令查找

Linux 基础指令(二):文件复制移动、内容查看、时间管理与命令查找

头像

🔥 星恒随风:
个人主页

❄️ 个人专栏:
《指针合集》

《C语言基础》

《数据结构》

《机器学习导论》

《前端基础》

《python基础》

《C++从入门到入土》

《Linux的学习之旅》

✨ 数据即知识,压缩即智能


文章目录

  • Linux 基础指令(二):文件复制移动、内容查看、时间管理与命令查找
    • 前言
    • 一、rm 命令的进一步补充
      • 1.1 删除文件前询问
      • 1.2 递归删除并逐项询问
      • 1.3 强制递归删除
    • 二、man:不会用命令时先查手册
      • 2.1 基本语法
      • 2.2 man 手册的章节
      • 2.3 同名内容为什么需要指定章节?
      • 2.4 查看所有同名手册页
      • 2.5 根据关键字搜索手册
      • 2.6 查看 man 自己的手册
      • 2.7 其他帮助方式
    • 三、cp:复制文件和目录
      • 3.1 基本语法
      • 3.2 复制一个普通文件
      • 3.3 复制到指定目录
      • 3.4 复制时修改文件名
      • 3.5 一次复制多个文件
      • 3.6 使用通配符复制
      • 3.7 覆盖目标文件
      • 3.8 递归复制目录
      • 3.9 使用归档模式复制
      • 3.10 常用选项
    • 四、mv:移动文件、移动目录和重命名
      • 4.1 修改文件名
      • 4.2 移动文件到另一个目录
      • 4.3 移动并重命名
      • 4.4 移动整个目录
      • 4.5 目标文件已存在
      • 4.6 常用选项
      • 4.7 cp 和 mv 的区别
    • 五、cat:查看和连接文本文件
      • 5.1 查看一个小型文本文件
      • 5.2 同时查看多个文件
      • 5.3 为所有输出行添加编号
      • 5.4 只给非空行编号
      • 5.5 压缩连续空行
      • 5.6 常用选项
      • 5.7 cat 不适合编辑文件
    • 六、重定向:把输出写入文件
      • 6.1 标准输出
      • 6.2 `>` 会覆盖原文件
      • 6.3 `>>` 会追加内容
      • 6.4 使用循环生成测试文件
    • 七、more:分页查看文件
      • 7.1 基本语法
      • 7.2 常用操作
      • 7.3 指定每页显示行数
      • 7.4 more 的局限
    • 八、less:更灵活地浏览长文本
      • 8.1 基本语法
      • 8.2 常用按键
      • 8.3 显示行号
      • 8.4 搜索时忽略大小写
      • 8.5 more 和 less 对比
    • 九、head:查看文件开头
      • 9.1 基本语法
      • 9.2 指定显示行数
      • 9.3 常见使用场景
    • 十、tail:查看文件结尾和跟踪日志
      • 10.1 默认查看最后 10 行
      • 10.2 指定显示行数
      • 10.3 实时跟踪日志
      • 10.4 模拟动态日志
      • 10.5 `tail -F`
      • 10.6 head 和 tail 对比
    • 十一、管道:把一个命令的输出交给另一个命令
      • 11.1 查看某一段行
      • 11.2 统计目录中的前几项
      • 11.3 在输出中搜索
      • 11.4 管道和重定向的区别
    • 十二、date:查看和格式化时间
      • 12.1 查看当前时间
      • 12.2 自定义输出格式
      • 12.3 常见格式符
      • 12.4 Unix 时间戳
      • 12.5 把时间戳转换为可读时间
      • 12.6 设置系统时间
    • 十三、cal:查看日历
      • 13.1 查看当前月份
      • 13.2 查看指定年份
      • 13.3 查看指定月份
      • 13.4 查看相邻三个月
      • 13.5 查看全年
      • 13.6 显示一年中的第几天
    • 十四、find:在目录树中查找文件
      • 14.1 基本语法
      • 14.2 按文件名查找
      • 14.3 忽略文件名大小写
      • 14.4 按类型查找
      • 14.5 限制搜索深度
      • 14.6 按文件大小查找
      • 14.7 按修改时间查找
      • 14.8 对查找结果执行操作
      • 14.9 find 和普通文件名查找的区别
    • 十五、which:查找命令对应的程序路径
      • 15.1 基本使用
      • 15.2 PATH 是什么?
      • 15.3 which 不一定能说明实际执行的内容
      • 15.4 使用 type 查看完整来源
      • 15.5 在脚本中使用 command -v
    • 十六、把这一阶段的命令串起来
      • 16.1 创建练习目录
      • 16.2 创建测试文件
      • 16.3 查看文件
      • 16.4 复制项目
      • 16.5 移动文件
      • 16.6 查找文件
      • 16.7 查看命令路径和帮助
      • 16.8 清理练习目录

前言

上一篇文章已经讲解了 Linux 的目录树、绝对路径、相对路径,以及下面这些基础命令:

ls
pwd
cd
touch
mkdir
rmdir
rm

掌握这些命令以后,我们已经能够完成最基本的文件创建和删除操作。

不过,真正使用 Linux 时还会遇到更多问题:

一个命令的参数忘了怎么办?
怎样复制文件和目录?
怎样移动文件或者修改文件名?
怎样查看一个文本文件?
文件有几千行时应该怎样阅读?
怎样只查看文件开头或结尾的内容?
怎样把一个命令的结果交给另一个命令?
怎样查看当前时间?
怎样在目录树中查找文件?
怎样找到一条命令对应的可执行程序?

本文围绕这些问题继续学习 Linux 基础指令。

其中:

root:当前登录用户
xxx :经过匿名处理的主机名
~ :当前位于 root 用户的家目录
# :超级用户提示符

本文使用 root 只是为了统一演示格式。实际开发中,除系统管理操作外,更推荐使用普通用户工作,必要时再通过 sudo 获取临时权限。


一、rm 命令的进一步补充

上一篇已经介绍了 rm 的基本用法:

rm 文件名
rm -r 目录名

这里再补充三个常见选项:

-i:删除前询问
-r:递归处理目录
-f:强制处理,不进行常规询问

1.1 删除文件前询问

先创建一个测试文件:

[root@xxx ~]# mkdir -p /root/linux_demo
[root@xxx ~]# cd /root/linux_demo
[root@xxx linux_demo]# touch note.txt

使用 -i 删除:

[root@xxx linux_demo]# rm -i note.txt
rm: remove regular empty file 'note.txt'? y

输入:

y

表示确认删除。

输入:

n

表示取消删除。

初学阶段使用 rm -i,可以减少误删文件的风险。

1.2 递归删除并逐项询问

创建多级目录:

[root@xxx linux_demo]# mkdir -p path1/path2/path3
[root@xxx linux_demo]# touch path1/file1.txt
[root@xxx linux_demo]# touch path1/path2/file2.txt

使用:

[root@xxx linux_demo]# rm -ri path1

系统会逐步询问:

是否进入 path1?
是否进入 path1/path2?
是否删除其中的文件?
是否删除已经变空的目录?

这种方式比较安全,但目录中项目很多时,需要进行大量确认。

1.3 强制递归删除

[root@xxx linux_demo]# rm -rf path1

其中:

-r:递归删除目录中的所有内容
-f:不进行常规询问

rm -rf 本身是一条正常命令,在构建脚本、部署脚本和临时目录清理中都很常见。

它的危险之处在于:

删除范围完全由后面的路径决定,而且通常不会给出再次确认的机会。

执行前至少要确认:

pwd
ls -al path1

确认当前目录和目标内容没有问题后,再执行删除。


二、man:不会用命令时先查手册

Linux 命令很多,每个命令又可能有大量选项。

没有必要把所有参数全部背下来。更重要的是知道:

忘记参数以后,应该去哪里查。

man 是 Linux 中最重要的帮助命令之一。

2.1 基本语法

man [章节号] 命令或主题

例如查看 ls 的手册:

[root@xxx ~]# man ls

进入手册以后,常用按键如下:

按键作用
Space 向下翻一页
Enter 向下移动一行
b 向上翻一页
/关键字 向下搜索关键字
n 跳到下一个匹配项
N 跳到上一个匹配项
q 退出手册

例如在 ls 手册中搜索 recursive:

/recursive

按下回车后,手册会定位到相关内容。

2.2 man 手册的章节

Linux 的 man 手册按照内容分为多个章节。

常见章节如下:

章节主要内容
1 普通用户命令
2 Linux 系统调用
3 C 标准库和系统库函数
4 设备文件和特殊文件
5 文件格式和配置文件格式
6 游戏
7 概述、协议、约定和其他主题
8 系统管理命令
9 内核相关接口或例程

不同系统安装的手册内容可能有所差异。

2.3 同名内容为什么需要指定章节?

printf 既可以表示 Shell 命令,也可以表示 C 标准库函数。

查看命令版本:

[root@xxx ~]# man 1 printf

查看 C 库函数:

[root@xxx ~]# man 3 printf

查看系统调用 fork:

[root@xxx ~]# man 2 fork

查看系统调用 open:

[root@xxx ~]# man 2 open

指定章节的价值在于:

当多个手册页名称相同时,可以明确告诉 man 想查看哪一种内容。

2.4 查看所有同名手册页

[root@xxx ~]# man -a printf

-a 会依次打开所有匹配的手册页。

退出当前页面后,man 会继续尝试打开下一个匹配结果。

2.5 根据关键字搜索手册

[root@xxx ~]# man -k copy

它会列出描述中包含 copy 的相关手册页。

man -k 的效果通常类似:

apropos copy

如果只记得自己想做什么,却想不起命令名称,可以先使用关键字搜索。

2.6 查看 man 自己的手册

[root@xxx ~]# man man

这也是学习 Linux 的一个重要思路:

想知道 man 怎么用,就使用 man 查看 man。

2.7 其他帮助方式

不是所有问题都必须进入 man。

许多命令支持:

命令 –help

例如:

[root@xxx ~]# cp –help

Bash 内建命令可以使用:

[root@xxx ~]# help cd

常见帮助方式可以概括为:

man 命令 查看完整手册
命令 –help 查看简要参数说明
help 内建命令 查看 Bash 内建命令
man -k 关键字 根据功能描述搜索手册


三、cp:复制文件和目录

cp 是:

copy

的缩写,用于复制文件或目录。

3.1 基本语法

cp [选项] 源文件 目标位置

也可以一次复制多个源文件:

cp [选项] 源文件1 源文件2 目标目录

需要注意:

当源文件超过一个时,最后一个参数必须是已经存在的目录。

3.2 复制一个普通文件

创建测试文件:

[root@xxx linux_demo]# echo "hello Linux" > source.txt

查看内容:

[root@xxx linux_demo]# cat source.txt
hello Linux

复制文件:

[root@xxx linux_demo]# cp source.txt backup.txt

查看结果:

[root@xxx linux_demo]# ls -l
-rw-r–r– 1 root root 12 Jul 31 20:10 backup.txt
-rw-r–r– 1 root root 12 Jul 31 20:10 source.txt

查看副本内容:

[root@xxx linux_demo]# cat backup.txt
hello Linux

此时:

source.txt:原文件
backup.txt:新复制出的独立文件

修改其中一个文件,不会直接修改另一个文件。

3.3 复制到指定目录

创建目录:

[root@xxx linux_demo]# mkdir backup

复制文件:

[root@xxx linux_demo]# cp source.txt backup/

查看:

[root@xxx linux_demo]# ls backup
source.txt

文件名没有改变,只是复制到了另一个目录。

3.4 复制时修改文件名

[root@xxx linux_demo]# cp source.txt backup/source_copy.txt

查看:

[root@xxx linux_demo]# ls backup
source.txt source_copy.txt

复制和重命名可以在同一步完成。

3.5 一次复制多个文件

创建几个文件:

[root@xxx linux_demo]# touch main.cpp test.cpp README.md

全部复制到 backup:

[root@xxx linux_demo]# cp main.cpp test.cpp README.md backup/

3.6 使用通配符复制

复制所有 .cpp 文件:

[root@xxx linux_demo]# cp *.cpp backup/

这里的:

*

是 Shell 通配符,表示匹配任意长度的字符。

因此:

*.cpp

可以匹配:

main.cpp
test.cpp
server.cpp

但不会匹配:

README.md
main.c

需要注意,通配符通常由 Shell 先展开,再把展开后的文件名交给 cp。

可以先使用:

ls *.cpp

确认匹配结果,再执行复制。

3.7 覆盖目标文件

如果目标文件已经存在:

[root@xxx linux_demo]# cp source.txt backup.txt

通常会直接覆盖原来的 backup.txt。

为了避免无意覆盖,可以使用:

[root@xxx linux_demo]# cp -i source.txt backup.txt
cp: overwrite 'backup.txt'?

输入 y 才会覆盖。

3.8 递归复制目录

普通 cp 不能直接复制目录:

[root@xxx linux_demo]# cp project project_backup
cp: -r not specified; omitting directory 'project'

复制目录需要使用 -r:

[root@xxx linux_demo]# cp -r project project_backup

如果 project_backup 不存在,会创建一个新的目录副本。

可以查看:

[root@xxx linux_demo]# tree project_backup
project_backup
└── src
└── main.cpp

3.9 使用归档模式复制

[root@xxx linux_demo]# cp -a project project_backup

-a 可以理解为归档复制,适合完整复制目录结构。

它会尽量保留:

权限
时间戳
符号链接
目录结构
文件属性

普通学习场景中:

cp -r:递归复制目录
cp -a:更完整地保留源文件属性

3.10 常用选项

选项作用
-i 覆盖前询问
-r、-R 递归复制目录
-a 归档复制,尽量保留属性
-f 必要时强制覆盖目标
-v 显示复制过程

例如:

[root@xxx linux_demo]# cp -rv project project_backup
'project'> 'project_backup'
'project/src'> 'project_backup/src'
'project/src/main.cpp'> 'project_backup/src/main.cpp'


四、mv:移动文件、移动目录和重命名

mv 是:

move

的缩写。

它有两个常见用途:

移动文件或目录
修改文件或目录名称

这两种功能本质上都是改变文件在目录树中的位置或名称。

4.1 修改文件名

创建文件:

[root@xxx linux_demo]# touch old_name.txt

重命名:

[root@xxx linux_demo]# mv old_name.txt new_name.txt

查看:

[root@xxx linux_demo]# ls
new_name.txt

这里没有创建文件副本,只是把原文件名称改了。

4.2 移动文件到另一个目录

创建目录:

[root@xxx linux_demo]# mkdir documents

移动文件:

[root@xxx linux_demo]# mv new_name.txt documents/

查看:

[root@xxx linux_demo]# ls documents
new_name.txt

原目录中不再保留原文件。

4.3 移动并重命名

[root@xxx linux_demo]# mv documents/new_name.txt documents/note.txt

也可以移动到其他目录时顺便改名:

[root@xxx linux_demo]# mv documents/note.txt backup/note_backup.txt

4.4 移动整个目录

[root@xxx linux_demo]# mv project backup/

与 cp 不同,mv 移动目录时不需要添加 -r。

移动完成后,原位置不再存在 project,它会出现在:

backup/project

4.5 目标文件已存在

如果执行:

[root@xxx linux_demo]# mv source.txt backup.txt

并且 backup.txt 已存在,通常会覆盖目标文件。

可以使用:

[root@xxx linux_demo]# mv -i source.txt backup.txt
mv: overwrite 'backup.txt'?

确认后才会覆盖。

4.6 常用选项

选项作用
-i 覆盖前询问
-f 强制移动,不进行常规询问
-n 不覆盖已经存在的目标
-v 显示移动过程

例如:

[root@xxx linux_demo]# mv -v note.txt documents/
renamed 'note.txt'> 'documents/note.txt'

4.7 cp 和 mv 的区别

操作cpmv
原文件是否保留 保留 通常不保留
是否生成副本
能否重命名 复制时可指定新名字 可以
复制目录是否需要 -r 需要 不需要

五、cat:查看和连接文本文件

cat 是:

concatenate

的缩写。

它的主要功能包括:

显示文件内容
连接多个文件内容
配合重定向生成文件

5.1 查看一个小型文本文件

[root@xxx linux_demo]# cat source.txt
hello Linux

cat 会把文件内容直接输出到终端。

它适合查看:

内容较少的配置文件
简短的源代码
小型日志
简单文本

如果文件有几千行,直接 cat 会让内容迅速滚过屏幕,此时更适合使用后面的 less。

5.2 同时查看多个文件

[root@xxx linux_demo]# cat file1.txt file2.txt

cat 会按照参数顺序依次输出两个文件的内容。

例如:

[root@xxx linux_demo]# cat file1.txt
first
[root@xxx linux_demo]# cat file2.txt
second
[root@xxx linux_demo]# cat file1.txt file2.txt
first
second

5.3 为所有输出行添加编号

[root@xxx linux_demo]# cat -n source.txt
1 hello Linux

-n 会给所有输出行编号,包括空行。

5.4 只给非空行编号

假设文件内容为:

first

second

执行:

[root@xxx linux_demo]# cat -b text.txt
1 first

2 second

-b 只给非空行编号。

5.5 压缩连续空行

[root@xxx linux_demo]# cat -s text.txt

-s 会把多行连续空行压缩成一行空行。

需要注意,它不会删除全部空行,只会把连续的多个空行合并。

5.6 常用选项

选项作用
-n 为所有输出行编号
-b 只为非空行编号
-s 压缩连续空行

5.7 cat 不适合编辑文件

cat 可以查看文件,但它不是文本编辑器。

编辑文件通常需要使用:

vim
nano
其他编辑器

后续学习 Vim 时,再专门讲解终端中的文本编辑。


六、重定向:把输出写入文件

前面的示例中使用过:

echo "hello Linux" > source.txt

这里的:

>

叫做输出重定向符号。

6.1 标准输出

命令默认会把结果显示在终端中:

[root@xxx linux_demo]# echo "hello Linux"
hello Linux

把输出重定向到文件:

[root@xxx linux_demo]# echo "hello Linux" > output.txt

终端中不再显示 hello Linux,内容被写进了文件。

查看:

[root@xxx linux_demo]# cat output.txt
hello Linux

6.2 > 会覆盖原文件

[root@xxx linux_demo]# echo "first" > output.txt
[root@xxx linux_demo]# echo "second" > output.txt
[root@xxx linux_demo]# cat output.txt
second

第二次使用 > 时,原来的 first 被覆盖。

6.3 >> 会追加内容

[root@xxx linux_demo]# echo "first" > output.txt
[root@xxx linux_demo]# echo "second" >> output.txt
[root@xxx linux_demo]# cat output.txt
first
second

区别可以概括为:

> 覆盖写入
>> 追加写入

6.4 使用循环生成测试文件

下面生成 200 行测试数据:

[root@xxx linux_demo]# for i in $(seq 1 200); do echo "line $i"; done > lines.txt

查看行数:

[root@xxx linux_demo]# wc -l lines.txt
200 lines.txt

这份文件可以用于测试 more、less、head 和 tail。


七、more:分页查看文件

当文件内容很多时,直接使用:

cat lines.txt

内容会迅速滚动过去。

more 可以分页显示文本。

7.1 基本语法

more [选项] 文件

例如:

[root@xxx linux_demo]# more lines.txt

显示一页后,底部可能出现:

–More–(10%)

7.2 常用操作

按键作用
Space 向下翻一页
Enter 向下移动一行
b 尝试向上翻一页
/关键字 搜索关键字
q 退出

不同系统中的 more 功能可能存在一定差异。

7.3 指定每页显示行数

[root@xxx linux_demo]# more -10 lines.txt

表示每次按指定行数分页显示。

7.4 more 的局限

more 的功能比较基础,向前翻页、搜索和交互能力不如 less 灵活。

实际使用中,更推荐:

less 文件名


八、less:更灵活地浏览长文本

less 和 more 都用于分页查看文本,但 less 的功能更完整。

它支持:

向前翻页
向后翻页
上下搜索
显示行号
直接跳转
不必一次加载完整文件

8.1 基本语法

less [选项] 文件

例如:

[root@xxx linux_demo]# less lines.txt

8.2 常用按键

按键作用
Space、PageDown 向下翻页
b、PageUp 向上翻页
j、方向键下 向下移动一行
k、方向键上 向上移动一行
g 跳到文件开头
G 跳到文件末尾
/字符串 向下搜索
?字符串 向上搜索
n 重复上一次搜索方向
N 反向重复搜索
q 退出

8.3 显示行号

[root@xxx linux_demo]# less -N lines.txt

-N 会在左侧显示行号。

8.4 搜索时忽略大小写

[root@xxx linux_demo]# less -i application.log

-i 可以在搜索时忽略大小写,但具体行为还会受到搜索内容影响。

8.5 more 和 less 对比

对比项moreless
向下浏览 支持 支持
向上浏览 能力有限 支持
搜索 基础支持 支持上下搜索
跳到开头和末尾 能力较弱 支持
大文件查看 可以 更适合
实际使用频率 较低 较高

可以用一句常见的话记忆:

less is more

也就是 less 虽然名字叫“更少”,功能通常比 more 更多。


九、head:查看文件开头

head 用于查看文件开头的内容。

9.1 基本语法

head [选项] 文件

默认显示前 10 行:

[root@xxx linux_demo]# head lines.txt
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10

9.2 指定显示行数

显示前 5 行:

[root@xxx linux_demo]# head -n 5 lines.txt
line 1
line 2
line 3
line 4
line 5

在 GNU/Linux 中也经常写成:

head -5 lines.txt

不过完整写法:

head -n 5 lines.txt

语义更加明确。

9.3 常见使用场景

head 常用于:

快速检查数据文件格式
查看 CSV 文件表头
确认日志开头
抽样查看命令输出

例如:

[root@xxx linux_demo]# head -n 3 users.csv
id,name,age
1,Alice,20
2,Bob,21


十、tail:查看文件结尾和跟踪日志

tail 用于查看文件末尾内容。

10.1 默认查看最后 10 行

[root@xxx linux_demo]# tail lines.txt
line 191
line 192
line 193
line 194
line 195
line 196
line 197
line 198
line 199
line 200

10.2 指定显示行数

[root@xxx linux_demo]# tail -n 3 lines.txt
line 198
line 199
line 200

也可以简写成:

tail -3 lines.txt

10.3 实时跟踪日志

[root@xxx linux_demo]# tail -f application.log

-f 会持续等待文件新增内容。

当另一个程序继续向日志中写入数据时,终端会实时显示新增行。

退出跟踪:

Ctrl + C

10.4 模拟动态日志

终端一:

[root@xxx linux_demo]# touch application.log
[root@xxx linux_demo]# tail -f application.log

终端二:

[root@xxx linux_demo]# echo "server started" >> application.log
[root@xxx linux_demo]# echo "new request" >> application.log
[root@xxx linux_demo]# echo "request finished" >> application.log

终端一会依次显示:

server started
new request
request finished

10.5 tail -F

[root@xxx linux_demo]# tail -F application.log

-F 除了持续跟踪,还会在日志被轮转或重新创建后尝试重新打开文件。

因此在长期跟踪服务日志时,tail -F 往往比 tail -f 更稳妥。

10.6 head 和 tail 对比

head:查看开头
tail:查看结尾

它们都默认显示 10 行,也都可以使用:

-n 行数

指定输出数量。


十一、管道:把一个命令的输出交给另一个命令

管道符号是:

|

它会把左侧命令的标准输出,作为右侧命令的标准输入。

基本结构:

命令1 | 命令2

数据流可以表示为:

命令1
↓ 标准输出
管道 |
↓ 标准输入
命令2

11.1 查看某一段行

假设要查看 lines.txt 的第 180~200 行,共 21 行。

先取前 200 行:

head -n 200 lines.txt

再从这些结果中取最后 21 行:

[root@xxx linux_demo]# head -n 200 lines.txt | tail -n 21
line 180
line 181
line 182
...
line 200

完整逻辑是:

head 取出第 1~200 行

tail 从中取最后 21 行

得到第 180~200 行

这里很容易发生少一行的问题。

闭区间:

[180, 200]

包含的行数是:

200 – 180 + 1 = 21

所以应该使用:

tail -n 21

而不是 tail -n 20。

11.2 统计目录中的前几项

[root@xxx linux_demo]# ls -l | head -n 5

先由 ls -l 生成详细列表,再由 head 只保留前 5 行。

11.3 在输出中搜索

[root@xxx linux_demo]# ls -al | grep '\\.txt$'

左边列出文件,右边筛选以 .txt 结尾的结果。

grep 会在后续内容中单独讲解。

11.4 管道和重定向的区别

>、>>:把输出写入文件
| :把输出交给另一个命令

例如:

ls -al > files.txt

表示把结果保存到文件。

而:

ls -al | less

表示把结果交给 less 分页查看。


十二、date:查看和格式化时间

date 用于显示或设置系统日期和时间。

日常使用中最常见的是查看和格式化时间。

12.1 查看当前时间

[root@xxx ~]# date
Fri Jul 31 21:00:00 CST 2026

实际输出格式会受到:

系统语言
时区
发行版
环境变量

等因素影响。

12.2 自定义输出格式

基本结构:

date '+格式'

例如:

[root@xxx ~]# date '+%Y-%m-%d'
2026-07-31

同时显示日期和时间:

[root@xxx ~]# date '+%Y-%m-%d %H:%M:%S'
2026-07-31 21:00:00

由于格式中存在空格,建议使用引号包围。

12.3 常见格式符

格式含义
%Y 四位年份
%m 月份,01~12
%d 日期,01~31
%H 小时,00~23
%M 分钟,00~59
%S
%F 等价于 %Y-%m-%d
%T 通常等价于 %H:%M:%S
%s Unix 时间戳
%X 当前区域设置下的时间表示

例如:

[root@xxx ~]# date '+%F %T'
2026-07-31 21:00:00

12.4 Unix 时间戳

查看当前时间戳:

[root@xxx ~]# date +%s
1785502800

Unix 时间戳通常表示:

从 1970 年 1 月 1 日 00:00:00 UTC 开始经过的秒数。

时间戳不直接携带本地时区信息。

同一个时间戳在不同地区格式化后,可能显示不同的本地时间。

12.5 把时间戳转换为可读时间

[root@xxx ~]# date -d '@0' '+%F %T'
1970-01-01 08:00:00

如果系统时区是东八区,时间戳 0 可能显示为:

1970-01-01 08:00:00

查看 UTC 时间可以使用:

[root@xxx ~]# date -u -d '@0' '+%F %T'
1970-01-01 00:00:00

转换其他时间戳:

[root@xxx ~]# date -d '@1000000000' '+%F %T'
2001-09-09 09:46:40

具体结果会受到本地时区影响。

12.6 设置系统时间

具有相应权限时,可以使用:

date -s '2026-07-31 21:00:00'

但现代 Linux 系统通常使用:

NTP
chrony
systemd-timesyncd

等服务自动同步时间。

随意手动修改服务器时间可能影响:

日志顺序
数据库事务
证书验证
定时任务
分布式系统

因此生产服务器上不要随意使用 date -s。


十三、cal:查看日历

cal 用于在终端中显示日历。

某些精简系统默认没有安装该命令,出现 command not found 时,需要通过发行版的软件包管理器安装相关日历工具。

13.1 查看当前月份

[root@xxx ~]# cal
July 2026
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

13.2 查看指定年份

[root@xxx ~]# cal 2026

它会显示 2026 年全年的日历。

13.3 查看指定月份

[root@xxx ~]# cal 7 2026

表示查看 2026 年 7 月。

参数顺序是:

月份 年份

13.4 查看相邻三个月

[root@xxx ~]# cal -3

通常会显示:

上一个月
当前月
下一个月

13.5 查看全年

[root@xxx ~]# cal -y

-y 用于显示当前年份的全年日历。

13.6 显示一年中的第几天

[root@xxx ~]# cal -j

普通日历显示“某月某日”,而 -j 会按照一年中的天数编号显示。

例如:

1 月 1 日是第 1 天
2 月 1 日是第 32 天

闰年和普通年份的结果会有所不同。


十四、find:在目录树中查找文件

find 是 Linux 中功能非常强大的文件查找工具。

它会实际遍历指定目录树,根据条件匹配文件。

14.1 基本语法

find 起始路径 查找条件

例如:

find /root -name 'test.c'

含义是:

从 /root 开始
递归遍历下面的目录
查找名称为 test.c 的项目

14.2 按文件名查找

[root@xxx ~]# find /root -name 'test.c'
/root/project/test.c
/root/project/old/test.c

查找所有 .cpp 文件:

[root@xxx ~]# find /root -name '*.cpp'

建议给通配表达式加上引号:

'*.cpp'

否则 Shell 可能会在 find 执行前提前展开 *。

14.3 忽略文件名大小写

[root@xxx ~]# find /root -iname 'readme.md'

它可以同时匹配:

README.md
Readme.md
readme.md

14.4 按类型查找

只查普通文件:

[root@xxx ~]# find /root/linux_demo -type f

只查目录:

[root@xxx ~]# find /root/linux_demo -type d

常见类型包括:

类型含义
f 普通文件
d 目录
l 符号链接

组合文件名和类型:

[root@xxx ~]# find /root/linux_demo -type f -name '*.txt'

14.5 限制搜索深度

只搜索起始目录和下一层:

[root@xxx ~]# find /root/linux_demo -maxdepth 2 -type f

-maxdepth 可以避免无意义地遍历过深的目录。

14.6 按文件大小查找

查找大于 10 MB 的文件:

[root@xxx ~]# find /root -type f -size +10M

查找小于 1 KB 的文件:

[root@xxx ~]# find /root -type f -size -1k

其中:

+:大于
-:小于
M:MiB 量级单位
k:KiB 量级单位

14.7 按修改时间查找

查找最近 7 天修改过的文件:

[root@xxx ~]# find /root -type f -mtime -7

查找超过 30 天没有修改的文件:

[root@xxx ~]# find /root -type f -mtime +30

14.8 对查找结果执行操作

[root@xxx ~]# find /root/linux_demo -type f -name '*.txt' -exec ls -l — {} \\;

其中:

{} 表示当前找到的文件
\\; 表示 -exec 操作结束

执行删除等危险操作前,应当先只输出结果:

find /root/linux_demo -type f -name '*.tmp' -print

确认无误后,再考虑进行后续处理。

14.9 find 和普通文件名查找的区别

find 搜索的是文件系统目录树。

它可以根据:

名称
类型
大小
修改时间
权限
所有者
路径

等条件查找。

功能非常强,但从大目录开始搜索时可能产生较多磁盘访问,因此起始路径应尽量具体。

不推荐在没有必要时直接执行:

find /

这可能遍历大量系统目录,并产生权限错误或较长等待时间。


十五、which:查找命令对应的程序路径

which 用于在当前 PATH 环境变量指定的目录中,查找某条命令对应的可执行程序。

15.1 基本使用

[root@xxx ~]# which ls
/usr/bin/ls

查看 gcc:

[root@xxx ~]# which gcc
/usr/bin/gcc

查看 python3:

[root@xxx ~]# which python3
/usr/bin/python3

如果没有找到,通常不会输出路径,并返回非零状态。

15.2 PATH 是什么?

执行:

ls

时,我们并没有输入完整路径:

/usr/bin/ls

Shell 会按照 PATH 中记录的目录顺序寻找可执行程序。

查看 PATH:

[root@xxx ~]# echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

这些路径使用冒号分隔。

Shell 会依次尝试:

/usr/local/sbin/ls
/usr/local/bin/ls
/usr/sbin/ls
/usr/bin/ls
/root/bin/ls

找到可执行文件后便停止搜索。

15.3 which 不一定能说明实际执行的内容

有些命令可能是:

Shell 内建命令
别名
Shell 函数
外部可执行程序

例如 pwd 通常既有 Bash 内建版本,也可能存在:

/usr/bin/pwd

执行:

which pwd

可能显示:

/usr/bin/pwd

但当前 Shell 真正执行的可能优先是内建版本。

15.4 使用 type 查看完整来源

[root@xxx ~]# type ls
ls is aliased to 'ls –color=auto'

查看所有可能来源:

[root@xxx ~]# type -a pwd
pwd is a shell builtin
pwd is /usr/bin/pwd
pwd is /bin/pwd

因此:

which:主要查找 PATH 中的外部可执行程序
type :判断命令是别名、函数、内建命令还是外部程序

15.5 在脚本中使用 command -v

[root@xxx ~]# command -v gcc
/usr/bin/gcc

判断某个命令是否存在:

if command -v gcc >/dev/null 2>&1; then
echo "gcc 已安装"
else
echo "未找到 gcc"
fi

脚本中通常更推荐使用:

command -v

而不是依赖不同系统上实现可能不同的 which。


十六、把这一阶段的命令串起来

下面通过一个完整练习,把本文命令连接起来。

16.1 创建练习目录

[root@xxx ~]# mkdir -p /root/linux_demo/article/src
[root@xxx ~]# cd /root/linux_demo/article

确认当前位置:

[root@xxx article]# pwd
/root/linux_demo/article

16.2 创建测试文件

[root@xxx article]# for i in $(seq 1 200); do echo "line $i"; done > data.txt
[root@xxx article]# touch src/main.cpp

16.3 查看文件

[root@xxx article]# head -n 5 data.txt
line 1
line 2
line 3
line 4
line 5

查看结尾:

[root@xxx article]# tail -n 3 data.txt
line 198
line 199
line 200

分页浏览:

[root@xxx article]# less -N data.txt

16.4 复制项目

[root@xxx article]# cd ..
[root@xxx linux_demo]# cp -a article article_backup

查看:

[root@xxx linux_demo]# find article_backup -maxdepth 3
article_backup
article_backup/data.txt
article_backup/src
article_backup/src/main.cpp

16.5 移动文件

[root@xxx linux_demo]# mkdir logs
[root@xxx linux_demo]# mv article/data.txt logs/data.log

16.6 查找文件

[root@xxx linux_demo]# find . -type f -name '*.cpp'
./article/src/main.cpp
./article_backup/src/main.cpp

16.7 查看命令路径和帮助

[root@xxx linux_demo]# which find
/usr/bin/find

查看手册:

[root@xxx linux_demo]# man find

16.8 清理练习目录

先检查:

[root@xxx linux_demo]# pwd
/root/linux_demo
[root@xxx linux_demo]# ls -al

再交互式删除:

[root@xxx linux_demo]# rm -ri article article_backup logs


赞(0)
未经允许不得转载:网硕互联帮助中心 » Linux 基础指令(二):文件复制移动、内容查看、时间管理与命令查找
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!