Unix 在tar文件中查找特定的字符串模式,然后提取这些特定的文件
所以我想做一个新的线程,这样我就不会在一页上问两个问题- 我得到了一个解决方案,可以在tar ball中搜索和查找文件的模式和字符串,而无需提取: 这就是我得到的: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 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
选项fortar
)并搜索$PATTERN
)。-q
选项阻止grep
打印$PATTERN
:我们只想知道是否找到了它。
如果找到$PATTERN
,grep
返回0,那么我们继续提取文件:
tar xzf $i
否则,什么也不会发生,我们继续下一个文件