文件管理与IO重定向精要指南
一、文件系统核心结构
-
目录树特性
- 单根倒置树结构,根目录
/ - 文件名称大小写敏感(Mail ≠ mail)
- 隐藏文件以
.开头(如.bashrc) - 路径分隔符:
/ - 最大文件名长度:255字节
- 最大路径长度:4095字节
- 单根倒置树结构,根目录
-
文件类型标识
符号 类型 示例 -普通文件 file.txtd目录 /home/userl符号链接 /bin/sh → dashb块设备 /dev/sdac字符设备 /dev/ttyp管道文件 named_pipes套接字文件 /run/docker.sock -
目录颜色约定
- 蓝色:目录
- 绿色:可执行文件
- 红色:压缩文件
- 浅蓝:链接文件
- 灰色:其他文件
二、目录与文件操作
-
目录管理
mkdir /data/project # 创建目录 mkdir -p /data/project/{src,log} # 递归创建 tree -L 2 /data # 查看目录结构(2级深度) basename /path/to/file.txt # 输出 file.txt dirname /path/to/file.txt # 输出 /path/to -
安全删除实践
场景 安全操作 危险操作 删除文件 rm -f old.logrm -rf /data/*生产环境删除 mv bigfile /tmp/trash/rm -rf /*清空正在使用的文件 cat /dev/null > running.log直接删除导致空间不释放 -
文件占用问题解决
lsof | grep deleted # 查找被删除但未释放的文件 ps aux | grep 1234 # 查看占用进程(1234为PID) kill -9 1234 # 终止进程 df -h # 验证空间释放
三、文件元数据与时间戳
-
时间类型对比
类型 查看命令 触发条件 atimels -lu/stat文件被读取 mtimels -l(默认) /stat文件内容修改 ctimels -lc/stat元数据变更(权限/所有者等) -
元数据操作
stat file.txt # 查看详细元数据 file unknown.bin # 检测文件类型 touch file.txt # 更新所有时间戳
四、通配符与模式匹配
| 通配符 | 功能 | 示例 |
|---|---|---|
* |
匹配任意字符 | rm *.log |
? |
匹配单个字符 | ls file?.txt |
[abc] |
匹配指定字符 | cp [abc]*.conf /backup |
{a,b} |
扩展模式 | mkdir /dir{1,2,3} |
[^a-z] |
排除字符范围 | ls !(*.bak) |
# 备份非隐藏文件
cp -a !(.*) /backup/
五、Inode 深度解析
-
Inode 结构
graph LR A[文件名] --> B[Inode 表] B --> C[元数据] C --> D[权限/大小/时间] C --> E[数据块指针] -
关键命令
ls -i file.txt # 查看inode号 df -i # 查看分区inode总数 df -h # 查看磁盘空间使用 -
空间未释放解决方案
lsof +L1 # 查找已删除但被占用的文件 > /var/log/app.log # 清空文件释放空间 systemctl restart service # 重启占用进程
六、IO重定向高级技巧
-
标准流描述符
FD 名称 默认设备 0 stdin 键盘 1 stdout 屏幕 2 stderr 屏幕 -
重定向操作符
cmd > file # 标准输出覆盖重定向 cmd >> file # 标准输出追加重定向 cmd 2> error.log # 标准错误重定向 cmd &> all.log # 混合输出重定向 cmd 2>&1 | tee output.log # 同时输出到屏幕和文件 -
高级用法
# 多行输入重定向 cat <<EOF > config line1 line2 EOF # Here String tr 'a-z' 'A-Z' <<< "hello" # 进程替换 diff <(ls dir1) <(ls dir2)
七、文本处理命令
-
tr字符转换echo "123456" | tr '123' 'ABC' # ABC456 echo "Hello123" | tr -d '0-9' # Hello echo "aaabbbccc" | tr -s 'ab' # abccc -
tee双路输出# 覆盖写入 echo "New Data" | tee output.log # 追加写入 dmesg | tee -a system.log # 忽略中断信号 important_process | tee -i logfile