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 # 递归修改目录权限
权限数字含义:
| 数字 | 权限 | 含义 |
|---|---|---|
| 4 | r | 读 |
| 2 | w | 写 |
| 1 | x | 执行 |
解释: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及其常用选项 - 移动重命名:
mv、rename - 删除文件:
rm、rmdir,注意安全使用 - 创建目录:
mkdir - 查看文件:
cat、less、head、tail - 查找文件:
find、locate - 文件链接:
ln - 权限管理:
chmod、chown、chgrp
这些命令是 Linux 系统管理的基础,熟练掌握它们对于日常工作非常重要。