- 发布日期
Linux基础命令(二):文件操作与查找命令
- 作者
- 姓名
- 缘
- 社交账号
文章目录
本篇学习范围
上一篇解决了“怎样定位目录”,本篇开始真正操作文件。内容按最常见的工作顺序展开:
创建文件
↓
查看文件
↓
复制、移动或重命名
↓
谨慎删除
↓
按名称和大小查找
所有示例都建议在自己的 HOME 目录或专门的练习目录中执行。
touch:创建文件
touch 用于创建文件,基本语法为:
touch 文件路径
例如:
touch hello.txt
touch ~/linux-practice/notes.txt
touch ./logs/app.log
touch 没有必须学习的常用选项,重点在于参数必须是目标文件路径。路径可以使用绝对路径、相对路径和特殊路径符。
若目标文件不存在,touch 会创建一个空文件;若文件已存在,它通常不会清空内容,而会更新文件的时间戳。因此它适合初始化空文件或确保某个文件存在,不适合用来写入正文。
cat 和 more:查看文件内容
cat:一次输出全部内容
cat 用于查看文件内容:
cat 文件路径
例如:
cat hello.txt
cat /etc/services
它会把文件全部输出到终端,适合内容较短的文本。文件过大时,输出会迅速滚过屏幕,不方便阅读。
more:分页查看长文件
more 同样用于查看文件,但支持分页:
more 文件路径
例如:
more /etc/services
在 more 的阅读界面中:
| 按键 | 作用 |
|---|---|
| 空格 | 向下翻一页 |
q | 退出查看 |
cat 和 more 只负责查看,不会修改文件。对于可以自由前后翻页和搜索的大文件,实际环境中还常使用 less,但本课件的重点是先分清 cat 的“一次显示”和 more 的“分页显示”。
cp:复制文件和目录
cp 来自 copy,用于复制文件或目录:
cp [-r] 被复制对象 目标位置
复制文件:
cp hello.txt backup.txt
cp hello.txt ~/backup/
第一个命令会在当前目录创建 backup.txt;第二个命令会把 hello.txt 复制到 ~/backup/ 目录中。
复制目录时必须添加 -r:
cp -r project project-backup
cp -r project ~/backup/
-r 表示递归复制,即把目标目录及其内部的子目录、文件一并复制。没有 -r 时,cp 不能完成普通目录的复制。
复制前建议先确认目标目录存在并且名称写对:
pwd
ls
ls ~/backup
这样可以避免把文件复制到错误位置或意外覆盖同名文件。
mv:移动文件、目录和重命名
mv 来自 move,用于移动文件或目录:
mv 被移动对象 目标位置
移动到已有目录:
mv hello.txt ~/backup/
mv project ~/archive/
目标路径不存在时,mv 会表现为重命名:
mv hello.txt hello-old.txt
mv project project-v2
因此同一个命令可以完成两类操作:
| 目标是否存在 | mv source target 的效果 |
|---|---|
target 是已有目录 | 把 source 移入该目录 |
target 不存在 | 把 source 改名为 target |
mv 不需要 -r 才能移动目录。移动目录与复制目录不同,它只是改变目录位置或名称,并不是把全部内容另建一份副本。
rm:删除前必须确认
rm 来自 remove,用于删除文件或目录:
rm [-r] [-f] 文件或目录路径...
删除一个文件:
rm hello.txt
一次删除多个文件:
rm a.txt b.txt c.txt
删除目录时必须使用 -r:
rm -r old-project
| 选项 | 作用 |
|---|---|
-r | 递归删除目录及其内容 |
-f | 强制删除,不进行交互确认 |
是否出现确认提示取决于发行版、Shell 别名、权限和当前环境,不能把某一种表现当作 Linux 的固定规则。-f 会进一步抑制错误和确认信息,初学时一般没有必要使用。
rm 中的通配符
rm 可以使用 * 做模糊匹配:
| 模式 | 匹配含义 |
|---|---|
test* | 名称以 test 开头的内容 |
*test | 名称以 test 结尾的内容 |
*test* | 名称中包含 test 的内容 |
例如:
rm test*
会删除当前目录中所有以 test 开头的匹配项。Shell 会在执行前先展开 *,所以实际被删除的文件可能比直觉中更多。
若匹配对象中包含目录,只有添加 -r 才能递归删除目录内容:
rm -r test*
这条命令风险更高,必须先用 ls test* 确认实际匹配结果。
删除命令的安全规则
rm 删除的内容通常不会进入回收站。含有 -r、-f 或 * 时风险会显著增加,特别是在 root 用户下。
执行前至少做这几件事:
pwd # 确认当前位置
ls # 查看当前目录的内容
ls test* # 先观察通配符会匹配哪些内容
不要执行以根目录或系统目录为目标的递归强制删除命令,也不要为了“方便”长期使用 root 账号。练习删除时,先在 HOME 目录中创建专门的测试文件。
which:命令程序在哪里
终端中执行的很多命令,本体是系统中的可执行程序。which 可以查看某个命令会使用哪一个程序文件:
which 命令名
例如:
which ls
which java
which vim
输出通常是一个路径,例如 /usr/bin/ls。这有助于理解:ls 不是特殊语法,而是 Shell 在环境变量 PATH 指定的位置中找到并运行的程序。
which 只需要一个参数,即想查询的命令名;它不用于按任意文件名搜索,后者应当使用 find。
find:按名称和大小查找文件
find 可以在指定目录树中搜索文件或目录。它功能强大,先掌握两种最常用条件即可。
按名称查找
基本语法:
find 起始路径 -name "名称模式"
示例:
# 从根目录开始找名为 test 的内容
find / -name "test"
# 在当前目录及子目录中找 config.yml
find . -name "config.yml"
# 在 /usr 下找名称含 centos 的内容
find /usr -name "*centos*"
名称模式中也可以使用 *:
| 写法 | 查找结果 |
|---|---|
find / -name "test*" | 名称以 test 开头 |
find / -name "*test" | 名称以 test 结尾 |
find / -name "*test*" | 名称中包含 test |
引号很重要。它会阻止当前 Shell 提前展开 *,使通配模式作为一个整体传给 find。
按文件大小查找
基本语法:
find 起始路径 -size [+|-]数字单位
其中:
| 组成部分 | 含义 |
|---|---|
+ | 大于指定大小 |
- | 小于指定大小 |
| 数字 | 大小数值 |
k | KB,使用小写 k |
M | MB |
G | GB |
例如:
find / -size -10k
find /usr -size +100M
find / -size +1G
分别表示查找小于 10 KB、大于 100 MB 和大于 1 GB 的文件。
控制搜索范围
从 / 开始搜索会遍历整个系统,可能耗时较长,也会遇到无权限读取的目录。优先选择更小、更符合目标的起始路径:
find ~ -name "*.txt"
find /usr -size +100M
如果只是在自己的项目中找文件,使用 find . ... 往往更快也更清晰。
本篇命令速查
| 目标 | 命令 |
|---|---|
| 创建空文件 | touch 文件名 |
| 查看短文件 | cat 文件名 |
| 分页查看长文件 | more 文件名 |
| 复制文件 | cp 源文件 目标 |
| 复制目录 | cp -r 源目录 目标 |
| 移动或重命名 | mv 源 目标 |
| 删除文件 | rm 文件名 |
| 删除目录 | rm -r 目录名 |
| 查命令程序位置 | which 命令名 |
| 按名称查找 | find 路径 -name "模式" |
| 按大小查找 | find 路径 -size +100M |