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 的区别
| 原文件是否保留 | 保留 | 通常不保留 |
| 是否生成副本 | 是 | 否 |
| 能否重命名 | 复制时可指定新名字 | 可以 |
| 复制目录是否需要 -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 对比
| 向下浏览 | 支持 | 支持 |
| 向上浏览 | 能力有限 | 支持 |
| 搜索 | 基础支持 | 支持上下搜索 |
| 跳到开头和末尾 | 能力较弱 | 支持 |
| 大文件查看 | 可以 | 更适合 |
| 实际使用频率 | 较低 | 较高 |
可以用一句常见的话记忆:
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
网硕互联帮助中心






评论前必须登录!
注册