![未按内容压缩的文件被错误地双重 gzip 压缩](https://linux22.com/image/190448/%E6%9C%AA%E6%8C%89%E5%86%85%E5%AE%B9%E5%8E%8B%E7%BC%A9%E7%9A%84%E6%96%87%E4%BB%B6%E8%A2%AB%E9%94%99%E8%AF%AF%E5%9C%B0%E5%8F%8C%E9%87%8D%20gzip%20%E5%8E%8B%E7%BC%A9.png)
我有一些文件被错误地压缩了两次没有文件扩展名
例如,gzip -dc file
某些文件输出一些二进制乱码,而其他一些文件则没问题
我想运行一个命令,以便能够在文件夹中找到双 gzip 压缩文件(并非所有文件都是双 gzip 压缩,但所有文件都至少一次)并自动将它们恢复为单个 gzip 压缩状态
答案1
你可以这样做:
for file in *; do
zcat -- "$file" |
file - |
grep -wq compressed &&
gunzip -- "$file"
done
这样做的优点是能够在任意文件名上运行(与你的方法与ls
, 参见http://mywiki.wooledge.org/ParsingLs),而且看起来也简单得多。至少在我看来是这样。
缺点是您最终可能会得到没有.gz
扩展名的 gzip 压缩文件。但这很容易解决:
for file in *; do
case "$file" in
*.gz) ;;
*) file -- "$file" |
grep -wq compressed &&
mv -v -- "$file" "$file".gz;;
esac
done
答案2
这是我使用的命令:
ls | xargs -L1 -I[] sh -c 'basename "[]" | xargs -L1 -I{} sh -c "cp -a \"[]\" \"/tmp/{}.gz\" && gzip -d \"/tmp/{}.gz\" && file \"/tmp/{}\" | (grep compressed -q && rsync -a \"/tmp/{}\" \"[]\" --remove-source-files) || rm \"/tmp/{}\""'
它基本上将文件复制到/tmp/
解压缩一次,检查该新文件是否仍被压缩(file some_file | grep compressed -q
),如果是,则将其移回其原始位置(rsync source dest --remove-source-files
),如果不是,则删除临时文件