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

时间:2014-06-06 17:08:08

标签: unix save tar extraction

所以我想创建一个新主题,所以我没有在一个页面上提出两个问题 -

我得到了一个搜索和查找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'

1 个答案:

答案 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_FILENAMEf)并使用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

否则,没有任何反应,我们继续下一个文件。