Shell 如何在不解压缩文件夹的情况下从多个压缩文件中读取文件内容?

Shell 如何在不解压缩文件夹的情况下从多个压缩文件中读取文件内容?,shell,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 t

我将许多日志文件压缩到一个名为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,如何指向我的文件?或者还有其他方法吗?

问题是您正在使用
tar
gzip
——这是正确的处理方法,但您没有使用
tar
的优势来实现这一目标

tar
命令代表“磁带存档”:

tar(磁带存档)命令的用途是管理存档 磁带或磁盘上的文件。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
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
log1.txt
tar
存档中文件的完整路径。因此,如果它嵌套在像
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
这样做的好处是,您可以通过管道将其传输到
更少的
更多的
,如下所示:

tar -xvf logfiles.tar.gz log1.txt
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
x
f
选项基本上只是告诉
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.

您的回答告诉我如何解压缩压缩文件夹中的一个文件。我编辑了这个问题,因为我想知道的是如何在不解压缩文件的情况下阅读内容。我使用tar的另一个原因是将文件分组在一起,以便一次压缩所有文件。我会投你一票,因为你的建议使我离我要寻找的东西更近了一步。(但仍在等待更接近的解决方案)@Mahshidzeinal感谢您的澄清。检查我的最新编辑。使用
tar xfO logfiles.tar.gz log2.txt应该可以工作。您甚至可以使用
|
连接一个管道,将输出重定向到
less
more