【Linux从入门到精通】第4篇:文件操作基础——增删改查的艺术(上)
一、引言:命令行文件操作的思维转变
如果你习惯了Windows或macOS的图形界面,文件操作的模式大概是这样的:右键→新建文件夹→重命名→拖拽复制→右键删除→清空回收站。
这套流程在Linux命令行里会被压缩成几个简短的命令。一开始你可能会觉得“不如鼠标点点方便”,但当你需要一次性创建10个目录、批量重命名100个文件、或者精确复制特定类型的文件时,命令行的效率会彻底碾压图形界面。
更关键的是:图形界面只能做它允许你做的事,命令行能做你想做的任何事——包括那些图形界面根本没提供选项的操作。
今天我们要掌握的五个命令,是你未来在Linux中“搬砖”的基础工具。它们分别是:
| 命令 | 全称 | 功能 |
|---|---|---|
touch | touch | 创建空文件 / 更新时间戳 |
mkdir | make directory | 创建目录 |
cp | copy | 复制文件或目录 |
mv | move | 移动文件或目录 / 重命名 |
rm | remove | 删除文件或目录 |
按“增删改查”的逻辑,touch和mkdir是“增”,cp是“复制增”,mv是“改位置/改名字”,rm是“删”。查的部分我们上一篇已经用ls解决了。
二、touch:不止是“摸一下”
2.1 基本用法
touch最常用的功能是创建一个空文件:
bash
touch filename.txt
如果文件不存在,touch会创建一个大小为0字节的空文件;如果文件已存在,touch不会破坏文件内容,只会更新文件的访问时间和修改时间为当前时间。
一次创建多个文件:
bash
touch file1.txt file2.txt file3.txt
2.2 进阶理解:Linux文件的三种时间戳
每个Linux文件都维护着三个时间戳,这是理解touch深层作用的关键:
| 时间类型 | 缩写 | 含义 | 何时更新 |
|---|---|---|---|
| 访问时间 | atime | 最后一次读取文件内容 | cat、less等读取操作 |
| 修改时间 | mtime | 最后一次修改文件内容 | 编辑文件并保存 |
| 状态时间 | ctime | 最后一次修改文件属性 | chmod、chown等 |
你可以用stat命令查看文件的这三个时间:
bash
$ stat test.txt File: test.txt Size: 0 Blocks: 0 IO Block: 4096 regular empty file Access: 2026-04-18 10:30:00.000000000 +0800 Modify: 2026-04-18 10:30:00.000000000 +0800 Change: 2026-04-18 10:30:00.000000000 +0800
touch一个已存在的文件,会将atime和mtime刷新为当前时间。
2.3 实用场景
场景一:批量创建测试文件
bash
touch test_{1..10}.txt # 创建 test_1.txt 到 test_10.txt场景二:让文件免于被自动清理
某些系统会定期清理长时间未被访问的临时文件。用touch刷新一下时间戳,就能让重要文件“续命”。
场景三:创建带日期名的文件
bash
touch log_$(date +%Y%m%d).txt # 创建 log_20260418.txt
三、mkdir:构建你的目录王国
3.1 基本用法
bash
mkdir my_folder # 创建单个目录 mkdir dir1 dir2 dir3 # 同时创建多个目录
3.2 核心参数:-p 递归创建
这是mkdir最重要的参数。假设你想创建这样的目录结构:
text
project/ ├── src/ │ └── main/ └── docs/
不使用-p的话,你必须逐层创建:
bash
mkdir project mkdir project/src mkdir project/src/main mkdir project/docs
使用-p,一条命令搞定:
bash
mkdir -p project/{src/main,docs}-p还有一个贴心的特性:如果目录已存在,它不会报错。这让你在写脚本时可以放心使用,不用担心重复执行导致脚本中断。
3.3 花括号展开:效率倍增器
上面例子中用到的{src/main,docs}是Shell的“花括号展开”功能,它可以生成多个路径组合:
bash
mkdir -p project/{src/{main,test},docs,bin}这条命令会创建:
project/src/main
project/src/test
project/docs
project/bin
一次创建,省下无数次mkdir。这是命令行效率远超图形界面的典型例子。
四、cp:复制的正确姿势
4.1 基本用法
bash
cp source.txt dest.txt # 复制文件并重命名 cp file1.txt file2.txt dest/ # 复制多个文件到目录
4.2 核心参数
| 参数 | 含义 | 使用场景 |
|---|---|---|
-r | 递归复制 | 复制目录时必须使用 |
-i | 覆盖前询问 | 防止误覆盖重要文件 |
-f | 强制覆盖 | 不询问,直接覆盖 |
-p | 保留属性 | 保留原文件的权限、时间戳 |
-a | 归档模式 | 等同于-rp,常用于备份 |
复制目录必须加-r:
bash
cp -r my_project backup_project/
不加-r去复制目录会报错:cp: -r not specified; omitting directory
4.3 一个容易踩的坑
bash
cp file.txt /backup
如果/backup是一个已存在的目录,file.txt会被复制到/backup/file.txt。
如果/backup不存在,file.txt会被复制为名为/backup的文件。
这种“看情况决定是复制进目录还是重命名”的行为,是很多新手困惑的来源。建议始终明确目标:
要复制到目录:确保目录存在,路径以
/结尾(如/backup/)要重命名:确保目标路径的父目录存在
五、mv:移动与重命名的合体技
5.1 两个功能,一套语法
Linux没有单独的“重命名”命令,mv同时承担移动和重命名两个职责:
bash
mv oldname.txt newname.txt # 重命名(同一目录内移动) mv file.txt /home/user/documents/ # 移动到其他目录 mv file.txt /home/user/docs/renamed.txt # 移动并重命名
这种设计背后的逻辑是:在Linux眼中,重命名无非就是“将文件从A名字移动到B名字”,二者没有本质区别。
5.2 实用技巧
批量移动特定文件:
bash
mv *.log logs/ # 移动所有.log文件到logs目录 mv test_* backup/ # 移动所有test_开头的文件
用mv实现“替换”:
bash
mv new_config.conf config.conf
如果config.conf已存在,会被覆盖。如果不确定,加上-i参数:
bash
mv -i new_config.conf config.conf # 覆盖前询问
5.3 mv和cp的核心区别
一个关键差异:mv移动文件时,如果源和目的在同一个文件系统,它只修改文件的路径指针,速度极快。而cp需要实际读写数据,大文件会很慢。
所以:同一分区内移动大文件用mv,跨分区移动或备份用cp。
六、rm:最危险的命令,没有之一
6.1 基本用法
bash
rm file.txt # 删除文件 rm -r directory/ # 删除目录(递归) rm -f file.txt # 强制删除,不询问
6.2 危险组合:rm -rf
rm -rf是Linux命令行的“核武器”。组合起来意味着:强制、递归、删除——不问任何问题,删除指定路径下的所有内容。
bash
rm -rf / # 删除整个系统(绝对不要执行!) rm -rf * # 删除当前目录下所有内容 rm -rf . # 删除当前目录及其所有子内容
6.3 “删库跑路”不是笑话
程序员圈子里有个流传已久的梗:
“某程序员删库跑路,公司损失千万。”
这不是虚构的段子,而是真实发生过的生产事故。2017年,GitLab的一位运维工程师在修复数据库问题时,误执行了rm -rf命令,删除了主数据库的数据目录,导致网站宕机数十小时,大量数据永久丢失。
事故的根本原因很简单:凌晨疲惫时,在错误的终端窗口执行了正确的删除命令。
6.4 防御措施
第一道防线:给rm套上“确认”枷锁
在~/.bashrc中添加:
bash
alias rm='rm -i'
这样每次执行rm时,系统都会要求你确认。
第二道防线:执行前先用ls确认
在敲下rm -rf some_path之前,先执行:
bash
ls -la some_path
看清楚你要删的是什么。
第三道防线:绝对路径谨慎对待
bash
# 危险写法(相对路径,容易误操作) rm -rf ./* # 安全写法(绝对路径,迫你确认目标) rm -rf /home/user/temp_project/*
第四道防线:考虑使用trash-cli
安装trash-cli工具,它会把文件移动到回收站而非直接删除:
bash
sudo apt install trash-cli # Ubuntu/Debian trash-put important_file.txt # 放入回收站
6.5 数据恢复的可能性
如果你真的误删了重要文件,立即停止对该磁盘的任何写入操作,甚至可以考虑直接关机。然后使用专业恢复工具如sleuthkit尝试恢复。
但必须认清现实:rm删除的文件并非100%可恢复,数据可能已被覆盖。所以备份才是王道。
七、特殊符号文件名:能创建,但不建议
7.1 Linux文件命名的规则
Linux文件名规则非常宽松:
最长255个字节
除了斜杠
/和空字符NULL,所有字符都合法包括空格、换行符、引号、星号、问号……都可以出现在文件名里
7.2 如何创建带特殊符号的文件名
带空格的文件名:
bash
touch "my file.txt" # 方法一:用引号包裹 touch my\ file.txt # 方法二:用反斜杠转义空格
带引号的文件名:
bash
touch "file'name.txt" # 单引号 touch 'file"name.txt' # 双引号
带横杠开头的文件名(这个尤其麻烦):
bash
touch -- "-filename.txt" # -- 表示后面不是命令参数
带特殊字符的文件名:
bash
touch "file*.txt" # 星号 touch "file?.txt" # 问号
7.3 操作特殊文件名同样需要技巧
创建容易,操作难:
bash
# 删除带空格的文件 rm "my file.txt" rm my\ file.txt # 删除带横杠的文件(不加--会被当成命令参数) rm -- "-filename.txt" # 删除带星号的文件(不加引号会被展开成所有文件) rm "file*.txt"
7.4 核心建议:别这么干
虽然Linux允许你创建各种奇怪的文件名,但在实际工作中,强烈建议只使用字母、数字、下划线、点号和短横线。原因很简单:
特殊字符会让脚本处理变得复杂
换行符等不可见字符会让调试变成噩梦
不是所有工具都能正确处理好转义
最佳实践:文件名用a-z、A-Z、0-9、_、-、.,避免空格,用下划线代替空格(如my_project_report.txt)。
八、本篇小结
五个命令的记忆口诀:
| 命令 | 一句话记忆 |
|---|---|
touch | 摸一下,文件就有了 |
mkdir | -p走天下,目录随便建 |
cp | 复制目录别忘了-r |
mv | 移动和重命名是一回事 |
rm | 永远敬畏-rf |
综合练习
请在终端完成以下操作:
bash
# 1. 创建项目结构 mkdir -p my_project/{src,docs,data,logs} cd my_project # 2. 创建文件 touch README.md src/main.py data/config.yaml # 3. 备份整个项目(注意用cp -r) cd .. cp -r my_project my_project_backup # 4. 重命名一个文件 cd my_project mv README.md README_old.md # 5. 安全删除备份(确认无误后) cd .. rm -ri my_project_backup # -i 会让你确认每个文件九、下篇预告
本文我们掌握了文件的创建、复制、移动和删除。但还有一个重要问题没有解决:如何查看和搜索文件内容?
下一篇,我们将进入文件查看与搜索的世界,学习cat、less、head、tail、find、grep等命令。特别是tail -f实时监控日志的技巧——这可能是你日后用得最多的运维命令之一。
延伸思考:试试执行touch .hidden_file和ls,然后再执行ls -a。你发现了什么?以点开头的文件在Linux中是隐藏文件——下一篇我们会深入这个话题。
