跳到主要内容

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 选项可以设置自定义时间戳,格式为 [[CC]YY]MMDDhhmm[.ss]

使用重定向创建文件

> 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 # 递归强制删除目录(危险操作!)

注意事项

  • -r(recursive)递归删除目录及其内容
  • -f(force)强制删除,忽略不存在的文件,不提示
  • -i(interactive)删除前确认
  • 警告rm -rf 是危险命令,删除后无法恢复

安全删除建议

# 设置别名,防止误删
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# 使用 trash-cli 工具代替 rm
sudo apt install trash-cli
trash file.txt # 移到回收站
restore-trash # 恢复
trash-list # 列出回收站内容
trash-empty # 清空回收站

创建目录

mkdir - 创建目录

mkdir dir                 # 创建目录
mkdir dir1 dir2 dir3 # 创建多个目录
mkdir -p dir1/dir2/dir3 # 递归创建多级目录
mkdir -v dir # 显示创建过程
mkdir -m 755 dir # 创建时设置权限

解释

  • -p(parents)自动创建父目录,如果目录已存在不报错
  • -m(mode)设置目录权限

删除目录

rmdir - 删除空目录

rmdir dir             # 删除空目录
rmdir -p dir1/dir2 # 递归删除空目录
rmdir -v dir # 显示删除过程

注意rmdir 只能删除空目录,删除非空目录请使用 rm -r

查看文件

cat - 查看文件内容

cat file.txt          # 查看文件内容
cat -n file.txt # 显示行号
cat -b file.txt # 只对非空行显示行号
cat -s file.txt # 压缩连续空行
cat file1 file2 # 查看多个文件
cat file1 file2 > new # 合并文件

less - 分页查看

less file.txt         # 分页查看文件

交互操作

快捷键功能
Space下一页
b上一页
Enter下一行
g跳到开头
G跳到结尾
/pattern向下搜索
?pattern向上搜索
n下一个匹配
N上一个匹配
q退出

head 和 tail - 查看文件头尾

head file.txt         # 查看前 10 行
head -n 20 file.txt # 查看前 20 行
head -c 100 file.txt # 查看前 100 字节

tail file.txt # 查看后 10 行
tail -n 20 file.txt # 查看后 20 行
tail -f file.txt # 实时跟踪文件更新
tail -f -n 50 file.txt # 从后 50 行开始跟踪

解释tail -f 是查看日志文件的常用命令,可以实时看到新写入的内容。

查找文件

find - 查找文件和目录

find /path -name "*.txt"       # 按名称查找
find /path -iname "*.txt" # 忽略大小写
find /path -type f # 只找文件
find /path -type d # 只找目录
find /path -size +100M # 大于 100MB 的文件
find /path -size -1M # 小于 1MB 的文件
find /path -mtime -7 # 7 天内修改过
find /path -mtime +30 # 超过 30 天未修改
find /path -user root # 属于 root 用户
find /path -perm 755 # 权限为 755
find /path -empty # 空文件或目录

# 组合条件
find /path -name "*.log" -mtime +7 -delete # 删除 7 天前的日志

# 执行操作
find /path -name "*.txt" -exec chmod 644 {} \; # 修改权限
find /path -name "*.tmp" -ok rm {} \; # 交互式删除

locate - 快速查找

locate file.txt       # 快速查找文件
locate -i file.txt # 忽略大小写
locate -c "*.txt" # 统计匹配数量
sudo updatedb # 更新数据库

解释locate 使用数据库查找,速度比 find 快很多,但可能不是最新结果。数据库通常每天自动更新一次。

which 和 whereis - 查找命令

which python          # 查找命令位置
whereis python # 查找命令、源码、手册位置

文件链接

ln - 创建链接

# 硬链接
ln file1 file2 # 创建硬链接

# 符号链接(软链接)
ln -s file1 file2 # 创建符号链接
ln -s /path/to/dir link_name # 创建目录链接

# 查看链接
ls -l file2 # 查看链接指向
readlink file2 # 读取链接目标

硬链接 vs 符号链接

特性硬链接符号链接
跨文件系统不支持支持
链接目录不支持支持
原文件删除仍可访问链接失效
inode与原文件相同不同

文件权限

chmod - 修改权限

chmod 755 file        # 数字方式设置权限
chmod u+x file # 给所有者添加执行权限
chmod g-w file # 移除组的写权限
chmod o=r file # 其他人只读
chmod a+x file # 所有人添加执行权限
chmod -R 755 dir # 递归修改目录权限

权限数字含义

数字权限含义
4r
2w
1x执行

解释:755 = 7(所有者rwx) + 5(组rx) + 5(其他人rx)

chown - 修改所有者

chown user file            # 修改所有者
chown user:group file # 修改所有者和组
chown :group file # 只修改组
chown -R user:group dir # 递归修改

chgrp - 修改所属组

chgrp group file       # 修改所属组
chgrp -R group dir # 递归修改

文件属性

stat - 查看文件状态

stat file.txt          # 查看文件详细信息
stat -c "%s" file.txt # 只显示文件大小
stat -c "%y" file.txt # 只显示修改时间

file - 查看文件类型

file file.txt          # 查看文件类型
file -i file.txt # 显示 MIME 类型
file -b file.txt # 不显示文件名

小结

本章介绍了 Linux 文件操作的核心命令:

  • 创建文件touch、重定向
  • 复制文件cp 及其常用选项
  • 移动重命名mvrename
  • 删除文件rmrmdir,注意安全使用
  • 创建目录mkdir
  • 查看文件catlessheadtail
  • 查找文件findlocate
  • 文件链接ln
  • 权限管理chmodchownchgrp

这些命令是 Linux 系统管理的基础,熟练掌握它们对于日常工作非常重要。