跳到主要内容

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 # 查看压缩包内容

小结

本章我们学习了:

  1. 创建文件(touch、重定向)
  2. 复制文件(cp 及其选项)
  3. 移动和重命名(mv、rename)
  4. 删除文件(rm、trash-cli)
  5. 链接文件(软链接、硬链接)
  6. 文件通配符
  7. 文件压缩(gzip、tar、zip)

练习

  1. 创建一个名为 test.txt 的文件,写入一些内容
  2. 复制 test.txt/tmp 目录
  3. test.txt 重命名为 test_backup.txt
  4. 创建一个目录的 tar.gz 压缩包
  5. 创建一个软链接指向某个日志文件
  6. 使用通配符删除所有 .tmp 文件