批量解压缩不带 gz 扩展名的 gzip 文件

批量解压缩不带 gz 扩展名的 gzip 文件

我有大量带有诸如等扩展名的文件.0_1234 .0_4213.0_4132其中一些是gzip压缩的,一些是原始电子邮件。我需要确定哪些是压缩文件,解压缩这些文件,并在解压缩所有压缩文件后将所有文件重命名为通用扩展名。我发现我可以使用 file 命令来确定哪些是压缩的,然后 grep 结果并使用sed将输出缩减为文件列表,但无法确定如何解压缩看似随机的扩展名。这是我到目前为止所拥有的

file *|grep gzip| sed -e 's/: .*$//g'

我想使用xargs或某种东西来获取输出中提供的文件列表,并将它们重命名为.gz以便可以解压缩,或者简单地在线解压缩它们。

答案1

不要使用gzipzcat而是使用不需要扩展的。您可以一次性完成整件事。只需尝试zcat该文件,如果由于未压缩而失败,cat则会:

for f in *; do 
    ( zcat "$f" || cat "$f" ) > temp && 
    mv temp "$f".ext && 
    rm "$f" 
done

上面的脚本将首先尝试将zcat文件写入temp,如果失败(如果文件不是 gzip 格式),它就会直接cat写入。它在子 shell 中运行,以捕获运行的命令的输出并将其重定向到临时文件 ( temp)。然后,将其temp重命名为原始文件名加上扩展名(.ext在本例中),并删除原始文件。

答案2

你可以做类似的事情

for f in ./*
do 
gzip -cdfq "$f" > "${f}".some_ext
done

这会处理所有文件(甚至是未压缩的文件,通过-f)并写入(通过-c )并将输出标准输出 使用重定向将每个文件的内容保存到其.some_ext对应文件中。然后您可以删除原件,例如bash

shopt extglob
rm -f ./!(*.some_ext)

或者zsh

setopt extendedglob
rm -f ./^*some_ext

您甚至可以将生成的文件保存到另一个目录(这次假设您想删除原始扩展名),例如

for f in *
do 
gzip -cdfq -- "$f" > /some/place/else/"${f%.*}".some_ext
done

然后删除当前目录中的所有内容...

答案3

这将显示所有使用 gzip 压缩的文件的列表:

file /path/to/files | grep ': gzip compressed data' | cut -d: -f1

.gz在任何 gzip 压缩文件上添加扩展名,这个丑陋的 hack 可能会这样做:

for file in ./*; do
    if gzip -l "$file" > /dev/null 2>&1; then
        case "$file" in
          *.gz) :;; # The file already has the extension corresponding to its format
          *) mv "$file" "${file}.gz";;
        esac
        # Uncomment the following line to decompress them at the same time
        # gunzip "${file}.gz"
    fi
done

相关内容