当前位置: 首页 > 面试题库 >

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

彭骏
2023-03-14
问题内容

我有一个非常大的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文件中的文件,但是我仍然坚持如何以字符串的形式读取那些文件的内容。我想知道如何将文件内容打印为字符串? 这是我的下面的代码 问题答案: 只需将tar.Reader用作要读取的每个文件的io.Reader。 如果您需要整个文件作为字符串: 如果您需要逐行阅读,则更好:

  • 本文向大家介绍Linux中在不破坏磁盘的情况下使用dd命令,包括了Linux中在不破坏磁盘的情况下使用dd命令的使用技巧和注意事项,需要的朋友参考一下 无论你试图从即将坏掉的存储驱动器抢救数据,将归档备份到远程存储,还是在别处对活动分区制作一份完美副本,都要知道如何安全可靠地复制驱动器和文件系统。幸好,有dd这款简单而强大的镜像复制工具,而且历史悠久。在这方面没有比它更出色的工具了。 dd命令的解

  • 本文向大家介绍SQL Server获取磁盘空间使用情况,包括了SQL Server获取磁盘空间使用情况的使用技巧和注意事项,需要的朋友参考一下 对于DBA来说,监控磁盘使用情况是必要的工作,然后没有比较简单的方法能获取到磁盘空间使用率信息,下面总结下这些年攒下的脚本: 最常用的查看磁盘剩余空间,这个属于DBA入门必记的东西: xp_fixeddrives方式有点是系统自带,可直接使用,缺点是不能查

  • 问题内容: 如何从命令外壳中获得与.zip文件(而不是gzip)的等价形式,而无需将其解压缩?也就是说,如何列出.zip压缩文件中压缩的不同文件? 问题答案: Perreal的答案是正确的,但我建议安装工具(在发行版的软件包管理器中查找)。然后,对于任何类型的存档文件,bzip2,gzip,tar …,您只需记住一个命令:

  • 如果docker文件中有RUN命令,那么它会创建一些中间图像。我的问题是,这些中间图像是否占用硬盘的内存?如果是,docker build--rm应该足够了吗?

  • 问题内容: 我设法使我的第一个python脚本起作用,该脚本从URL下载.ZIP文件的列表,然后继续提取ZIP文件并将其写入磁盘。 我现在无所适从,无法实现下一步。 我的主要目标是下载并提取zip文件,并通过TCP流传递内容(CSV数据)。如果可以的话,我宁愿不实际将任何zip或解压缩的文件写入磁盘。 这是我当前的脚本,可以运行,但是不幸的是必须将文件写入磁盘。 问题答案: 我的建议是使用一个对象