Unix 在tar文件中查找特定的字符串模式,然后提取这些特定的文件

Unix 在tar文件中查找特定的字符串模式,然后提取这些特定的文件,unix,save,tar,extraction,Unix,Save,Tar,Extraction,所以我想做一个新的线程,这样我就不会在一页上问两个问题- 我得到了一个解决方案,可以在tar ball中搜索和查找文件的模式和字符串,而无需提取: 这就是我得到的: tar xzf archive.tgz --to-command \ 'grep --label="$TAR_FILENAME" -H PATTERN ; true' 我有点迷茫于如何解释这一点-这是我可以放在脚本中的东西吗?另外,如何将要提取的特定文件管道化到特定位置 我现在有这个(对于脚本),但我不知道这是否正确: T

所以我想做一个新的线程,这样我就不会在一页上问两个问题-

我得到了一个解决方案,可以在tar ball中搜索和查找文件的模式和字符串,而无需提取:

这就是我得到的:

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'

下面是一个小脚本,您可以使用它:

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
)一个文件,其名称在
$taru 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
选项for
tar
)并搜索
$PATTERN
)。
-q
选项阻止
grep
打印
$PATTERN
:我们只想知道是否找到了它。 如果找到
$PATTERN
grep
返回0,那么我们继续提取文件:

tar xzf $i
否则,什么也不会发生,我们继续下一个文件