如何在不占用磁盘空间的情况下在tar存档中的文件中使用grep模式

我有一个非常大的tar存档〜5GB。

我想在存档中的所有文件上使用grep表示一种模式(并打印具有模式的文件的名称),但不想通过提取存档来填充磁盘空间。

无论如何我能做到吗?

我尝试了这些,但这并没有给我包含模式的文件名,只是匹配的行:

tar -O -xf test.tar.gz | grep 'this'

tar -xf test.tar.gz --to-command='grep awesome'

tar的此功能还记录在哪里?tar xf test.tar $ FILE

回答:

这是我的看法:

while read filename; do tar -xOf file.tar "$filename" | grep 'pattern' | sed "s|^|$filename:|"; done < <(tar -tf file.tar | grep -v '/$')

解释如下:

  • while read filename; do -这是一个循环…
  • tar -xOf file.tar "$filename" -提取每个文件…
  • | grep 'pattern' -在这里放置图案…
  • | sed "s|^|$filename:|";-在文件名前加上,因此看起来像grep。盐调味。
  • done < <(tar -tf file.tar | grep -v '/$')-结束循环,获取与您的文件有关的文件列表while read

一条条件:如果|文件名中有OR栏(),则此行将中断。

嗯 实际上,这是一个不错的bash函数,您可以将其附加到.bashrc文件中:

targrep() {

local taropt=""

if [[ ! -f "$2" ]]; then

echo "Usage: targrep pattern file ..."

fi

while [[ -n "$2" ]]; do

if [[ ! -f "$2" ]]; then

echo "targrep: $2: No such file" >&2

fi

case "$2" in

*.tar.gz) taropt="-z" ;;

*) taropt="" ;;

esac

while read filename; do

tar $taropt -xOf "$2" \

| grep "$1" \

| sed "s|^|$filename:|";

done < <(tar $taropt -tf $2 | grep -v '/$')

shift

done

}

以上是 如何在不占用磁盘空间的情况下在tar存档中的文件中使用grep模式 的全部内容, 来源链接: utcz.com/qa/408761.html

回到顶部