未按内容压缩的文件被错误地双重 gzip 压缩

未按内容压缩的文件被错误地双重 gzip 压缩

我有一些文件被错误地压缩了两次没有文件扩展名

例如,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),如果不是,则删除临时文件

相关内容