我有大量带有诸如等扩展名的文件.0_1234
.0_4213
。.0_4132
其中一些是gzip
压缩的,一些是原始电子邮件。我需要确定哪些是压缩文件,解压缩这些文件,并在解压缩所有压缩文件后将所有文件重命名为通用扩展名。我发现我可以使用 file 命令来确定哪些是压缩的,然后 grep 结果并使用sed
将输出缩减为文件列表,但无法确定如何解压缩看似随机的扩展名。这是我到目前为止所拥有的
file *|grep gzip| sed -e 's/: .*$//g'
我想使用xargs
或某种东西来获取输出中提供的文件列表,并将它们重命名为.gz
以便可以解压缩,或者简单地在线解压缩它们。
答案1
不要使用gzip
,zcat
而是使用不需要扩展的。您可以一次性完成整件事。只需尝试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