修改 tar 存档中嵌套的文件

2024-04-09

我正在尝试做一个grep然后一个sed搜索文件内的特定字符串,这些文件位于多个 tar 内,全部位于一个主 tar 存档内。现在,我通过以下方式修改文件

  1. 首先解压主 tar 存档。
  2. 然后将里面的焦油全部提取出来。
  3. 然后进行递归grep进而sed替换文件中的特定字符串。
  4. 最后将所有内容再次打包到 tar 存档中,并将所有存档放入主存档中。

相当乏味。如何使用 shell 脚本自动执行此操作?


除了自动执行您概述的步骤之外,不会有太多选择,原因是答案中的警告所证明的Kimvais https://stackoverflow.com/users/180174/kimvais.

tar 修改操作

The tar命令有一些选项可以修改现有的 tar 文件。然而,由于多种原因,它们不适合您的场景,其中之一是需要编辑的是嵌套 tarball,而不是主 tarball。因此,您必须亲自完成这项工作。

假设

主存档中的所有存档是否都提取到当前目录或命名/创建的子目录中?也就是说,当你跑步时tar -tf master.tar.gz, 你有看到:

subdir-1.23/tarball1.tar
subdir-1.23/tarball2.tar
...

或者你看到:

tarball1.tar
tarball2.tar

(请注意,如果要嵌入更大的压缩 tarball 中,则嵌套 tar 本身不应被 gzip 压缩。)

主控重新打包程序

假设您有子目录符号,那么您可以执行以下操作:

for master in "$@"
do
    tmp=$(pwd)/xyz.$$
    trap "rm -fr $tmp; exit 1" 0 1 2 3 13 15
    cat $master |
    (
    mkdir $tmp
    cd $tmp
    tar -xf -
    cd *        # There is only one directory in the newly created one!
    process_tarballs *
    cd ..
    tar -czf - *   # There is only one directory down here
    ) > new.$master
    rm -fr $tmp
    trap 0
done

如果您在恶意环境中工作,请使用除tmp.$$为目录名称。然而,这种重新打包通常不会在恶意环境中进行,并且基于进程 ID 选择的名称足以为所有内容提供唯一的名称。指某东西的用途tar -f -输入和输出允许您切换目录,但仍然在命令行上处理相对路径名。如果您愿意,可能还有其他方法可以解决这个问题。我也用过cat将输入提供给子 shell,以便从上到下的流程清晰;从技术上讲,我可以通过使用来改进事情) > new.$master < $master在最后,但这隐藏了多行之后的一些关键信息。

trap 命令确保 (a) 如果脚本被中断(发出 HUP、INT、QUIT、PIPE 或 TERM 信号),临时目录将被删除并且退出状态为 1(不成功),并且 (b) 一旦子目录被删除,删除后,进程可以以零状态退出。

您可能需要在覆盖 new.$master 之前检查它是否存在。您可能需要检查提取操作是否确实提取了内容。您可能需要检查子压缩包处理是否确实有效。如果主 tarball 解压到多个子目录中,则需要将 'cd *' 进入某个循环,迭代它创建的子目录。

如果您对内容足够了解并且没有出现任何问题,那么所有这些问题都可以跳过。

进程压缩包

第二个脚本是process_tarballs;它依次在命令行上处理每个 tarball,提取文件、进行替换、重新打包结果等。使用两个脚本的一个优点是,您可以将 tarball 处理与处理一个更大的任务分开进行测试。包含多个 tarball 的 tarball。同样,如果每个子 tarball 都解压到自己的子目录中,生活会变得更加容易;如果其中任何一个解压到当前目录中,请确保为其创建一个新的子目录。

for tarball in "$@"
do
    # Extract $tarball into sub-directory
    tar -xf $tarball
    # Locate appropriate sub-directory.
    (
    cd $subdirectory
    find . -type f -print0 | xargs -0 sed -i 's/name/alternative-name/g'
    )
    mv $tarball old.$tarball
    tar -cf $tarball $subdirectory
    rm -f old.$tarball
done

您也应该在此处添加陷阱进行清理,以便该脚本可以与上面的主脚本隔离运行,并且仍然不会留下任何中间目录。在外部脚本的上下文中,您可能不需要在创建新 tarball 之前如此小心地保留旧 tarball(因此rm -f $tarbal而不是移动和删除命令),但按照其本身的权利处理,脚本应该小心不要损坏任何东西。

Summary

  • 你正在尝试的事情并不是微不足道的。
  • 可调试性将作业分成两个可以独立测试的脚本。
  • 当您知道文件中的实际内容时,处理极端情况就会容易得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修改 tar 存档中嵌套的文件 的相关文章

  • gethostbyname() 或 getnameinfo() 如何在后台工作?

    How gethostbyname or getnameinfo 在后台工作 include
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 停止服务时单元陷入故障状态(状态=143)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是我的问题 我有 CentOS 和 java 进程在上面运行 Java进程是通过启动 停止脚本来操作的 它也创建了 java 实例的 p
  • 在 LINUX 上使用 Python 连接到 OLAP 多维数据集

    我知道如何在 Windows 上使用 Python 连接到 MS OLAP 多维数据集 嗯 至少有一种方法 通常我使用 win32py 包并调用 COM 对象进行连接 import win32com client connection wi
  • 无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

    我正在尝试安装 pysam 执行后 python path to pysam master setup py build 这个错误的产生是 unable to execute x86 64 conda cos6 linux gnu gcc
  • Inotify linux 监视子目录

    是否可以以这种模式监视目录 storage data usernames Download gt storage data Download 我需要监视每个用户的下载文件夹中是否进行了更改 也许我需要创建所有路径的列表 将其放入数组中 并在
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 归档文件系统或格式

    我正在寻找一种文件类型来存储已退役系统的档案 目前 我们主要使用 tar gz 但从 200GB tar gz 存档中查找并提取几个文件是很麻烦的 因为 tar gz 不支持任何类型的随机访问读取规定 在你明白之前 使用 FUSE 安装 t
  • 在 OSX 和 GNU 中使用“find”删除带有数字的文件名

    我正在尝试搜索一个文件并删除名称中包含数字的类似文件 我的文件 txt from myfile 00 04 version txt myfile 00 txt find E iregex myfile 0 9 1 txt 删除 myfile
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • diff 文件仅比较每行的前 n 个字符

    我有2个文件 我们将它们称为 md5s1 txt 和 md5s2 txt 两者都包含a的输出 find type f print0 xargs 0 md5sum sort gt md5s txt 不同目录下的命令 许多文件被重命名 但内容保
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • shell_exec 的输出被截断为 100 个字符

    当在 shell 中运行以下命令时 curl F file filename http 192 168 0 1 产生以下输出 Accuracy 0 0 1 classification Accuracy 0 0 1 classificati
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star

随机推荐

  • 检测不同分辨率下的图像相等性

    我正在尝试构建一个脚本来浏览我的原始高分辨率照片 并替换我在拥有专业帐户之前上传到 Flickr 的旧的低分辨率照片 对于其中许多 我可以只使用 Exif 信息 例如拍摄日期 来确定匹配 但有些确实很旧 要么原始文件没有 Exif 信息 要
  • 如何使用java从linux环境获取tomcat中当前目录的相对路径

    我想用来从我的网络应用程序外部读取属性文件 我在 Windows 环境中的 tomcat 中部署了一个 war 文件 并且可以使用以下代码从 Web 应用程序外部读取属性文件 Method 1 String filePath new jav
  • Android OpenCV 并行化循环

    我知道 OpenMP 包含在 NDK 中 使用示例如下 http recursify com blog 2013 08 09 openmp on android http recursify com blog 2013 08 09 open
  • 通过转发构造函数参数构建基于可变参数模板的 mixin

    我正在尝试构建一个 mixin 模板 其基础全部作为可变参数模板参数传递 我想通过将每个 mixin 类的构造函数参数作为参数传递给可变参数模板构造函数来构造 mixin 当使用每个 mixin 类类型的对象调用时 可变参数模板构造函数会进
  • 在 Objective-C 中观察文件或文件夹

    侦听文件夹或文件以查看其是否已保存或是否已添加新文件的最佳方法是什么 如果您只想监视目录但不处理单个文件的监视 那么 FSEvents API 是理想的选择 Stu Connolly 有一个很棒的 FSEvents C API 的 Obje
  • 如何使用“%f”将双精度值填充到具有正确精度的字符串中

    我正在尝试使用 a 来填充带有双精度值的字符串sprintf像这样 sprintf S f val 但精度被截断至小数点后六位 我需要大约 10 位小数来保证精度 如何才能做到这一点 宽度 精度 宽度应包括小数点 8 2表示8个字符宽 点前
  • UIButton 在 UIScrollView 中时不起作用

    我的观点结构 UITableView UITableViewCell UIScrollView CustomView UIButton 问题是当我触摸 UIButton 时它不起作用 我用代码创建它 btn UIButton alloc i
  • 继续打开 OpenFileDialog 直到选择有效文件

    我有打开 OpenFileDialog 的代码 我正在检查文件的大小以确保它不超过特定限制 但是 如果用户选择了一个大尺寸的文件 我需要警告他并引导他返回对话框以选择不同的文件或单击 取消 这是我尝试过的 OpenFileDialog di
  • 获取 PHP 中动态选择的类常量的值

    我希望能够做这样的事情 class ThingIDs const Something 1 const AnotherThing 2 thing Something id ThingIDs thing 这是行不通的 有没有一种简单的方法可以做
  • 调试 Windows 消息内容和目标的好方法是什么?

    我正在开发一个基于其他行为模拟 Windows 鼠标的应用程序 一个示例是按键盘上的 或 键将 WM MOUSEWHEEL 消息发送到具有适当增量的目标窗口 问题是 在某些情况下 我很难复制那些消息i thinkwindows 正在发送到目
  • CUDA:如何检查计算能力是否正确?

    使用较高计算能力编译的 CUDA 代码将在计算能力较低的设备上完美执行很长一段时间 然后有一天在某些内核中默默地失败 我花了半天时间追寻一个难以捉摸的错误 结果发现构建规则已经sm 21而该设备 Tesla C2050 是2 0 是否有任何
  • 如何在 HTML 中打印每个项目之间有延迟的列表

    Id for each item p p p p p p
  • 如何在 Asp.Net-MVC 中添加自定义 HTTP 标头

    我创建了一个自定义处理程序 如下所示 public class SitHandler DelegatingHandler protected override async Task
  • facebook php,如何使用结果分页?

    您好 我正在使用 Facebook PHP SDK v 3 1 1 我不明白如何使用结果分页 url 我想获取我所有朋友的列表 这是我的代码 friends fb gt api me friends friend Array data gt
  • Invalid Uri : uri 方案无效

    我正在尝试通过 WebRequest 登录网站 我此时遇到异常 WebRequest req WebRequest Create formUrl Trim string url string username string password
  • iOS 6 中使用 AudioFileServices 进行粒度合成

    我对我正在开发的声音合成应用程序有疑问 我正在尝试读取音频文件 使用创建随机 颗粒 颗粒合成技术 http en wikipedia org wiki Granular synthesis 将它们放入输出缓冲区 然后能够使用 OpenAL
  • 带有 ASP.NET 的 Google 日历 API

    我对使用 Google Calendar API 在 ASP NET Webforms C 中添加 修改事件感到困惑 我不确定我是否需要 oAuth 或者什么 我的应用程序位于我自己的服务器上 访问我自己的域和我自己的日历 我不需要其他用户
  • R:将矩阵重新排列为三列

    我在 R 中有一个矩阵 每个条目i j是分数 rownames 和 colnames 是 id 我只想要一个 3 列矩阵 而不是矩阵 i j score 现在我正在使用嵌套 for 循环 喜欢 for i in rownames g pri
  • 关于PE的魔数

    0x10b PE32 executable 0 107 ROM image 0x20b PE32 64 bit executable 是什么ROM image 有趣的问题 我涉足过操作 PE 文件 但从未注意到这一点 我认为它们的用途如下
  • 修改 tar 存档中嵌套的文件

    我正在尝试做一个grep然后一个sed搜索文件内的特定字符串 这些文件位于多个 tar 内 全部位于一个主 tar 存档内 现在 我通过以下方式修改文件 首先解压主 tar 存档 然后将里面的焦油全部提取出来 然后进行递归grep进而sed