我有一些文件被错误地压缩了两次没有文件扩展名
例如,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
),如果不是,则删除临时文件