《文件与目录:查找、压缩与资源清理》
文件操作是 Shell 运维中最基础也最常用的能力,本文汇总文件查找(find)、大小统计(du)、测试文件生成(dd)、大文件拆分(split)、压缩归档(tar/zip)与删除等命令,覆盖从定位到迁移的完整场景。
1 find:文件查找
find 按条件递归检索文件,支持 -type、-name、-size、-mtime 等条件,并可配合 -exec、-delete 直接处理。
# 列出目录下所有以 .t 结尾的文件
find ./ -type f -name "*.t" -exec ls {} \;
# 删除当前目录下所有日志文件 / .DS_Store 文件
find . -type f -name "*.log" -exec rm -f {} \;
find . -type f -name ".DS_Store" -exec rm -f {} \;
# 删除 20 天之前修改的日志(-ctime 单位:天)
find /var/log -name '*log' -type f -ctime +30 -delete 2>&1 >/dev/null
# 查找大于 4G 的文件
find . -type f -size +4G
排除目录:用 ! -path "dir/*" 配合 find 排除指定目录,再交给其他工具。
find . -type f -name "*.lua" ! -path "./deps/*" | xargs luacheck
2 xargs:把前一个命令的输出传给下一个命令
xargs 把标准输入逐条作为下一个命令的参数,适合处理「文件列表 -> 批量操作」。
# git status 中 typechange 的文件全部 checkout 掉
git status | grep typechange | awk -F":" '{print $2}' | xargs git checkout
# 结合 find:批量替换指定文件中的超时时间
find ./ -type f -name "*.tt" -exec sed -i 's/--- timeout: 5s/--- timeout: 10s/g' {} \;
注意:文件过多时会遇到「参数过长」,可用 find 的
-exec {} +或xargs分批执行。
3 dd:生成指定大小的文件
dd 常用来生成指定大小的测试文件(例如验证上传、压测)。
# 生成 10G 文件:bs 为块大小,count 为块数
dd if=/dev/urandom of=file.txt count=10240 bs=1048576 # 1048576 = 1M
# 1G 文件
dd if=/dev/urandom of=1g.txt count=1024 bs=1048576
# 850M 文件
dd if=/dev/urandom of=850m.txt count=850 bs=1048576
4 du:磁盘占用统计
# 查看目录总大小
du -sh directory
# 查看当前目录下各目录大小(一级)
du -h --max-depth=1
# 按大小排序 TopN(目录)
du -sh * | sort -nr | head
5 split:大文件拆分与合并
# 拆分成 500M 一块,数字后缀,后缀 3 位
split --bytes 500M --numeric-suffixes --suffix-length=3 big.bin big
# 简写形式:每块 100k
split -b 100k -d -a 3 big.bin big
# 生成片:big.000、big.001……
# 合并:
cat big.* > big_restored
# 验证一致性(exit code 0 表示一致)
cmp big.bin big_restored; echo $?
6 tar/zip:压缩归档
# 打包时忽略指定目录与文件(.pyc),并排除 VCS 目录
tar --exclude='log/' --exclude='*.pyc' --exclude-vcs -zcvf release.tar.gz release
# 仅打包指定文件
tar -zcvf conf.tar.gz nginx.conf redis.conf
# 查看 tar.gz 中的文件列表(不解包)
tar -tvf file.tar.gz
# 解包
tar -zxvf file.tar.gz -C /target/dir
zip/unzip:
apt install zip unzip # Debian / Ubuntu
# 多个文件
zip output_file.zip input1 input2
# 递归打包目录
zip -r output_file.zip file1 folder1
# 解压到指定目录
unzip output_file.zip -d /target/dir
7 rm/cat:处理特殊文件与清空
删除以 - 开头的文件(会被当成参数),用 -- 终止选项解析:
rm -f -- -fileName
cat -- -fileName
清理换行与多行合并(文件去换行、合并为一行):
# 将多行合并成一行
cat input.log | xargs echo -n | xargs echo
# 或用 sed 将换行替换为空格
sed ':a;N;$!ba;s/\n/ /g' log.txt
提示:文件这种「以 - 开头」的命名在 SCP、日志等场景都可能出现,删除时务必带
--前缀。
阅读 —
·
全站 —