《文件与目录:查找、压缩与资源清理》

《文件与目录:查找、压缩与资源清理》

文件操作是 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、日志等场景都可能出现,删除时务必带 -- 前缀。

阅读 — · 全站 —
🎸 我的歌单 0 首