从 tar 文件中删除特定文件

从 tar 文件中删除特定文件

我必须删除压缩后以 .tar 格式存储的文件。我必须解压文件,然后删除名称包含 XXX、YYY 或 ZZZ 的文件。有超过一千个 .tar 文件,每个 .tar 文件包含数百个 .zip 文件。我需要一个可以执行此操作的脚本。

答案1

我认为最好用递归程序来解决这个问题,不幸的是我不擅长创建递归 shell 脚本,所以我会推荐一个 C++ 程序。格式不标准,使用goto语句,并且会进行大量系统调用,但它会完成工作。由于未提供信息,因此假设所有 tarball 都使用.tar作为后缀,所有 tarball 均为 gzip 格式(如果这是不正确的,则很容易纠正),并且需要删除的文件名在所有 tarball 中都是相同的。

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <stdlib.h>

using namespace std;

int main()
{
system("touch ~/tarlist; list=$(find /path/to/tarballs/ type -f); echo $list > ~/tarlist; touch ~/currentTarline; touch ~/currentTarcolumn; touch currentTar");
system("touch ~/numoflinesTMP1; touch ~/numoflines; num=$(wc -l ~/tarlist); echo $num > ~/numoflinesTMP; num1=$(cut -c 1 ~/numoflinesTMP); echo $num1 > ~/numoflines"); mkdir ~/tmp/
int maxlines;
ifstream MAXLINES("~/numoflines");
MAXLINES>>maxlines;
MAXLINES.close();
int currentline=1;
GETTAR:
ofstream CURRENTLINE("~/currentTarline");
CURRENTLINE<<currentline;
CURRENTLINE.close();
system(line=$(cat ~/currentTarline); nameoftar=$(cat ~/tarlist | sed '$line!d'); echo $nameoftar > ~/currentTar; extract=$(cat ~/currentTar); cd ~/tmp/; tar -xzf $extract; rm *nameoffile*; tar czf $extract ./*; newline=$(( $line + 1 )); echo $newline > ~/currentTarline");
ifstream NEWLINE("~/currentTarline");
NEWLINE>>currentline;
NEWLINE.close();
if(currentline>=maxlines)
{
cout<<endl<<endl<<endl<<"FINISHED";
return 0;
}
else if(currentline<maxlines)
{
goto GETTAR;
}
}

对于缺乏水平格式,我深表歉意,但如果不给它一个列表结构,我找不到一种方法来做到这一点。此代码中使用的几个变量是占位符,您可能需要调整某些行以说明您希望程序使用的工作目录、需要从 tarball 中删除的文件的名称以及实际的父目录压缩包。希望这能作为一般指南。如果您确实愿意,您也可以将大部分系统调用放入递归 shell 脚本中,但我个人认为,首先花时间使 shell 脚本递归比简单地创建一个更麻烦。它的 C++ 包装器。祝你好运!

相关内容