Linux 文件操作
本章将介绍 Linux 中的文件操作命令,包括创建、复制、移动和删除文件。
文件概念
在 Linux 中,一切都是文件:
- 普通文件:文本文件、二进制文件等
- 目录:特殊的文件,包含文件列表
- 链接文件:指向其他文件的引用
- 设备文件:硬件设备的抽象
- 管道文件:进程间通信
创建文件
touch - 创建空文件或更新时间戳
touch file.txt # 创建空文件
touch file1 file2 file3 # 创建多个文件
touch -t 202403151030 file.txt # 设置特定时间戳
touch -d "2024-03-15 10:30:45" file.txt # 设置日期时间
解释:
- 如果文件不存在,
touch会创建空文件 - 如果文件存在,
touch会更新文件的访问时间和修改时间 -t选项可以设置自定义时间戳
使用重定向创建文件
> file.txt # 创建空文件(清空内容)
echo "Hello" > file.txt # 创建并写入内容
cat > file.txt # 从标准输入创建文件(Ctrl+D 结束)
复制文件
cp - 复制文件和目录
cp file1.txt file2.txt # 复制文件
cp file.txt /home/user/ # 复制到指定目录
cp file.txt /home/user/new.txt # 复制并重命名
cp file1.txt file2.txt dir/ # 复制多个文件到目录
cp -r dir1 dir2 # 递归复制目录
cp -p file1.txt file2.txt # 保留文件属性(权限、时间戳等)
cp -i file1.txt file2.txt # 交互式复制(覆盖前询问)
cp -f file1.txt file2.txt # 强制覆盖
cp -v file1.txt file2.txt # 显示复制过程
cp -u file1.txt file2.txt # 只复制更新的文件
常用组合:
cp -riv dir1/ dir2/ # 递归复制目录,显示过程,覆盖前询问
cp -rp dir1/ dir2/ # 递归复制目录,保留所有属性
解释:
-r(recursive)是复制目录必须的选项-p(preserve)保留文件的权限、所有者、时间戳等属性-i(interactive)防止误覆盖,推荐在别名中设置-v(verbose)显示操作过程,方便确认
备份文件示例
# 带时间戳备份
cp config.conf config.conf.bak.$(date +%Y%m%d)
# 保留原文件属性备份
cp -p important.dat important.dat.bak
移动和重命名
mv - 移动或重命名文件
mv old.txt new.txt # 重命名文件
mv file.txt /home/user/ # 移动文件到目录
mv file.txt /home/user/new.txt # 移动并重命名
mv file1.txt file2.txt dir/ # 移动多个文件到目录
mv dir1 dir2 # 重命名目录
mv -i old.txt new.txt # 交互式移动
mv -f old.txt new.txt # 强制覆盖
mv -v old.txt new.txt # 显示移动过程
mv -u old.txt new.txt # 只移动更新的文件
解释:
mv在同一文件系统内移动只是改变文件路径,速度很快- 跨文件系统移动实际上是复制+删除
批量重命名
使用 rename 命令(需要安装):
# 安装 rename
sudo apt install rename # Ubuntu/Debian
sudo yum install rename # CentOS/RHEL
# 将所有 .txt 改为 .bak
rename 's/\.txt$/\.bak/' *.txt
# 将所有文件名转为小写
rename 'y/A-Z/a-z/' *
# 在文件名前添加前缀
rename 's/^/prefix_/' *.txt
解释:rename 支持正则表达式,可以批量处理文件名。s/pattern/replacement/ 是替换语法。
删除文件
rm - 删除文件和目录
rm file.txt # 删除文件
rm file1 file2 file3 # 删除多个文件
rm -r dir # 递归删除目录
rm -f file.txt # 强制删除(不询问)
rm -i file.txt # 交互式删除
rm -v file.txt # 显示删除过程
rm -rf dir # 递归强制删除目录
警告
rm -rf / 或 rm -rf /* 会删除整个系统!执行删除命令前务必确认路径。
安全删除实践:
# 设置别名,删除前询问
alias rm='rm -i'
# 删除前先查看要删除的内容
ls -la dir/
rm -rf dir/
# 使用通配符时格外小心
rm -rf *.txt # 确保在正确的目录下执行
解释:
-r(recursive)递归删除目录及其内容-f(force)强制删除,不询问确认-i(interactive)删除前确认rm -rf是最常用的组合,但要格外小心
安全删除工具
# 安装 trash-cli
sudo apt install trash-cli # Ubuntu/Debian
sudo yum install trash-cli # CentOS/RHEL
# 使用
trash-put file.txt # 移到回收站
trash-list # 列出回收站内容
trash-restore # 恢复文件
trash-empty # 清空回收站
解释:trash-cli 提供类似 Windows 回收站的功能,比 rm 更安全。
链接文件
软链接(符号链接)
软链接是指向另一个文件的指针,类似 Windows 的快捷方式:
ln -s /path/to/file link_name # 创建软链接
ln -s /var/log/app.log ~/app.log # 创建指向日志的软链接
# 查看链接
ls -l link_name
# lrwxrwxrwx 1 user user 12 Mar 15 10:30 link_name -> /path/to/file
# 删除链接
rm link_name # 只删除链接,不影响原文件
特点:
- 可以跨文件系统
- 可以链接目录
- 原文件删除后链接失效
- 链接有独立的权限
硬链接
硬链接是文件的另一个名称,指向相同的数据:
ln file.txt hardlink_name # 创建硬链接
# 查看链接数
ls -l file.txt
# -rw-r--r-- 2 user user 100 Mar 15 10:30 file.txt
# ↑ 链接数
# 删除原文件,硬链接仍可访问数据
rm file.txt
cat hardlink_name # 仍然可以读取内容
特点:
- 不能跨文件系统
- 不能链接目录
- 原文件删除后仍可访问数据
- 与原文件共享相同的 inode
软链接 vs 硬链接
| 特性 | 软链接 | 硬链接 |
|---|---|---|
| 跨文件系统 | 可以 | 不可以 |
| 链接目录 | 可以 | 不可以 |
| 原文件删除 | 链接失效 | 链接有效 |
| inode | 不同 | 相同 |
| 文件大小 | 链接路径长度 | 与原文件相同 |
使用场景:
- 软链接:创建快捷方式、跨文件系统引用
- 硬链接:文件备份、防止误删
文件通配符
通配符用于匹配多个文件:
| 通配符 | 含义 | 示例 |
|---|---|---|
* | 匹配任意字符 | *.txt 匹配所有 txt 文件 |
? | 匹配单个字符 | file?.txt 匹配 file1.txt |
[abc] | 匹配指定字符 | file[123].txt |
[a-z] | 匹配字符范围 | [a-z].txt |
[!abc] | 不匹配指定字符 | file[!0-9].txt |
{a,b} | 匹配任意一个 | file.{txt,md} |
示例:
ls *.txt # 列出所有 txt 文件
ls file?.txt # 列出 file1.txt, file2.txt 等
ls [abc]* # 列出以 a, b, c 开头的文件
ls *[0-9]* # 列出文件名包含数字的文件
ls {*.txt,*.md} # 列出所有 txt 和 md 文件
rm file[1-3].txt # 删除 file1.txt, file2.txt, file3.txt
解释:通配符由 Shell 展开后再传给命令,不是命令本身的功能。
文件压缩
gzip - gzip 压缩
gzip file.txt # 压缩文件(原文件被删除)
gzip -k file.txt # 压缩并保留原文件
gzip -d file.txt.gz # 解压文件
gunzip file.txt.gz # 解压文件
gzip -r dir/ # 递归压缩目录中的文件
gzip -9 file.txt # 最大压缩率
gzip -1 file.txt # 最快压缩速度
tar - 归档文件
# 创建归档
tar -cvf archive.tar file1 file2 # 创建归档文件
tar -czvf archive.tar.gz dir/ # 创建 gzip 压缩归档
tar -cjvf archive.tar.bz2 dir/ # 创建 bzip2 压缩归档
# 解压归档
tar -xvf archive.tar # 解压 tar 归档
tar -xzvf archive.tar.gz # 解压 gzip 归档
tar -xjvf archive.tar.bz2 # 解压 bzip2 归档
tar -xzvf archive.tar.gz -C /path/ # 解压到指定目录
# 查看归档内容
tar -tvf archive.tar.gz
选项说明:
-c:创建归档-x:解压归档-v:显示过程-f:指定文件名-z:gzip 压缩/解压-j:bzip2 压缩/解压-C:指定解压目录
zip/unzip - zip 格式
# 压缩
zip archive.zip file1 file2
zip -r archive.zip dir/ # 递归压缩目录
# 解压
unzip archive.zip
unzip archive.zip -d /path/ # 解压到指定目录
unzip -l archive.zip # 查看压缩包内容
小结
本章我们学习了:
- 创建文件(touch、重定向)
- 复制文件(cp 及其选项)
- 移动和重命名(mv、rename)
- 删除文件(rm、trash-cli)
- 链接文件(软链接、硬链接)
- 文件通配符
- 文件压缩(gzip、tar、zip)
练习
- 创建一个名为
test.txt的文件,写入一些内容 - 复制
test.txt到/tmp目录 - 将
test.txt重命名为test_backup.txt - 创建一个目录的 tar.gz 压缩包
- 创建一个软链接指向某个日志文件
- 使用通配符删除所有
.tmp文件