所以我想创建一个新主题,所以我没有在一个页面上提出两个问题 -
我得到了一个搜索和查找tar球中的模式和文件串而不提取它的解决方案:
这就是我所得到的:
tar xzf archive.tgz --to-command \
'grep --label="$TAR_FILENAME" -H PATTERN ; true'
我有点迷失在如何解释这个 - 这是我可以放在脚本中的东西吗?另外,如何管理要提取到特定位置的特定文件?
我现在有这个(对于一个脚本),但我不知道这是否正确:
TAR_FILENAME=$1
PATTERN=$2
tar xzf archive.tgz --to-command \
'grep --label="$TAR_FILENAME" -H PATTERN ; true'
答案 0 :(得分:1)
这是一个你可以用来做的小脚本:
TAR_FILENAME=$1
PATTERN=$2
for i in $(tar -tf $TAR_FILENAME | grep -v '/$') ; do
if tar xOzf test.tar.gz $i | grep -q "$PATTERN" ; then
tar xzf $i ;
fi ;
done
它应该做你想要的。
现在让我用你自己的路线开始解释:
tar xzf archive.tgz --to-command \
'grep --label="$TAR_FILENAME" -H $PATTERN ; true'
第一行提取(x
)名称在$TAR_FILENAME
(f
)并使用gzip(z
)压缩的文件;它将它管道传递给tar
(--to-command
)的外部命令。
实际上它确实提取了你的tarball,但数据没有写入你的磁盘;而是将其发送到grep
命令,该命令搜索$PATTERN
。
选项--label=
和-H
用于打印tarball的名称(但不是用于找到模式的原始文件)(有关详细信息,请参阅手册页中的grep文档)。
如果grep
发现$PATTERN
至少发生一次,则在执行结束时返回0;否则,它返回1,由tar
解释为错误值。为了防止这种情况,我们确保tar
调用的外部命令返回0:我们调用true
。
所以你的代码所做的就是:提取所有文件并将其传递给grep,查找你的模式,并打印出这个模式的出现以及tarball的名称。
现在,让我们用伪代码检查我的建议:
for all files in tarball, do
extract file to standard output and pipe it to grep
use grep to search $PATTERN
if $PATTERN is found
extract this file to disk
endif
endfor
详细说明:
tar -tf $TAR_FILENAME | grep -v '/$'
打印tarball中的文件列表,并排除(-v
} grep
选项以/
,即目录结尾的grep
选项(我们不会'我想在for
)中管道目录。
因此我们打印此列表并在其上运行O
循环:对于所有thoose文件,将它们提取到标准输出(tar
的{{1}}选项)并搜索{{1 }}。 $PATTERN
选项会阻止-q
打印grep
:我们只想知道是否找到它。
如果找到$PATTERN
,则$PATTERN
返回0,因此我们继续提取文件:
grep
否则,没有任何反应,我们继续下一个文件。