我将一些日志文件压缩到一个名为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,我该如何指向我的文件?或者还有其他方法吗?
答案 0 :(得分:2)
问题是您使用tar
和gzip
- 这是处理此问题的正确方法 - 但您没有使用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.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
关于这一点的好处是你可以将它管道传输到less
或more
这样:
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.