Linux环境下递归识别无扩展名及伪装为txt的gz文件并解压
识别并解压Linux下伪装成txt的gz压缩文件
1. 定位目标文件
使用find结合file命令,扫描指定目录下所有后缀为.txt但实际是gzip压缩格式的文件:
find /path/to/your/backup -type f -name "*.txt" -exec sh -c 'file "$1" | grep -q "gzip compressed"' _ {} \; -print
将/path/to/your/backup替换为你的实际备份目录路径,执行后会输出所有符合条件的文件列表,方便提前确认。
2. 批量解压文件
确认目标文件无误后,执行以下命令批量解压(-k参数保留原伪装文件,避免误删):
find /path/to/your/backup -type f -name "*.txt" -exec sh -c 'file "$1" | grep -q "gzip compressed"' _ {} \; -exec gunzip -k {} \;
解压完成后,原伪装文件(如somefilename.txt)会保留,同时生成真实的文本文件(如somefilename),你可以手动将其重命名为somefilename.txt;或者用以下命令直接指定输出名,避免混淆:
find /path/to/your/backup -type f -name "*.txt" -exec sh -c ' if file "$1" | grep -q "gzip compressed"; then gunzip -c "$1" > "${1%.txt}.real.txt" fi ' _ {} \;
3. 处理双重压缩问题
如果存在多层压缩,可使用循环反复扫描解压,直到没有伪装的gz文件:
while true; do # 统计剩余的伪装文件数量 count=$(find /path/to/your/backup -type f -name "*.txt" -exec sh -c 'file "$1" | grep -q "gzip compressed"' _ {} \; -print | wc -l) if [ $count -eq 0 ]; then break fi # 批量解压当前识别到的文件 find /path/to/your/backup -type f -name "*.txt" -exec sh -c 'file "$1" | grep -q "gzip compressed"' _ {} \; -exec gunzip -k {} \; done
注意事项
- 若不需要保留原伪装文件,去掉命令中的
-k参数即可 - 建议先执行定位命令确认文件列表,再进行解压操作,避免误处理正常的txt文件
内容的提问来源于stack exchange,提问作者FrankyBoy
相关产品推荐
相关产品推荐

