如何从多个压缩文件中读取文件内容而不解压缩文件夹?

时间:2014-06-05 16:05:41

标签: shell

我将一些日志文件压缩到一个名为logfiles.gz的文件夹中 这是一个用于创建和压缩文件的samlpe:

touch log1.txt
touch log2.txt

echo "June 5, 2014. The system works!" >> log1.txt
echo "June 5, 2014. The system found a problem at line 3!" >> log2.txt

find . -name "log*.txt" |xargs tar -czvf logfiles.gz
gzip logfiles.gz

我想查看其中一个内容(log1.txt)而不解压缩整个文件夹甚至是该文件。

我想使用zcat但不知道如何在文件夹中指向我想要的文件!我试过了:

zcat logfiles.gz/log1.txt

但是出现了以下错误:

  

(logfiles.gz / log1.txt.Z):不是目录

如果我想使用zcat,我该如何指向我的文件?或者还有其他方法吗?

1 个答案:

答案 0 :(得分:2)

问题是您使用targzip - 这是处理此问题的正确方法 - 但您没有使用tar的优势来实现此目标。

tar命令代表“磁带存档”as explained here

  

tar(Tape ARchive)命令的目的是管理存档   磁带或磁盘上的文件。 Tar存储目录的结构   整个目录的档案,包括子目录和   可以创建,提取文件或生成目录。柏油   主要用作备份和传输工具。单个文件或   可以编写整个目录以及原始结构   到文件或直接到磁带。

因此,考虑到这一点,以下是我对shell命令列表的调整,以明确这是tar& gzip存档。

touch log1.txt
touch log2.txt

echo 'June 5, 2014. The system works!' >> log1.txt
echo 'June 5, 2014. The system found a problem at line 3!' >> log2.txt

find . -maxdepth 1 -name "log*.txt" | xargs tar -czvf logfiles.tar
gzip logfiles.tar

注意我还将双引号更改为echo行的单引号,以便将感叹号(!)正确添加到文件中。我添加了-maxdepth 1,因此该命令不会对您目录中的每个.txt文件起作用。此外,我将存档名称更改为logfiles.tar,以便将其正确压缩为logfiles.tar.gz

完成后,最终生成的文件应为:

logfiles.tar.gz

现在只需使用tar解压缩您的特定文件:

tar -xvf logfiles.tar.gz log1.txt

log1.txttar存档中文件的完整路径。因此,如果它嵌套在this/is/a/structure/这样的文件夹中,那么您可以通过指示this/is/a/structure/log1.txt来提取该文件。

无需运行gzip -d,因为现代版tar会自动知道如何解压缩压缩数据&直接进入里面的tar内容。

编辑:由于原始海报想要查看文件的内容而不实际解压缩存档,这应该有效:

tar xfO logfiles.tar.gz log1.txt
tar xfO logfiles.tar.gz log2.txt

关于这一点的好处是你可以将它管道传输到lessmore这样:

tar xfO logfiles.tar.gz log1.txt | less
tar xfO logfiles.tar.gz log2.txt | less

tar xfO logfiles.tar.gz log1.txt | more
tar xfO logfiles.tar.gz log2.txt | more

xf选项基本上只是告诉tar提取文件。这是正常的操作。但其中的神奇之处在于使用O选项,该选项会强制将输出写入标准输出而不实际提取文件:

 -O      (x, t modes only) In extract (-x) mode, files will be written to
         standard out rather than being extracted to disk.  In list (-t)
         mode, the file listing will be written to stderr rather than the
         usual stdout.