tarファイルから特定のファイルを削除する

tarファイルから特定のファイルを削除する

.tar形式に圧縮され、保存されたファイルを削除する必要があります。ファイルを解凍し、名前にXXX、YYY、またはZZZを含むファイルを削除する必要があります。数千を超える .tar ファイルがあり、各ファイルには数百の .zip ファイルが含まれています。これを行うにはスクリプトが必要です。

ベストアンサー1

この問題は、再帰プログラムで解決するのが最善だと思います。残念ながら、私は再帰的なシェルスクリプトを作成するのに苦手なので、C ++プログラムをお勧めします。フォーマットは標準ではなく、gotoステートメントを使用して多くのシステムコールを実行しますが、操作は完了です。情報が提供されていないため、すべてのタールボールは.tarサフィックスとして使用され、すべてのタールボールはgzip形式であり(間違っている場合は簡単に変更できます)、削除する必要があるファイル名はすべてのタールボールで同じであると仮定します。 。

#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から削除する必要があるファイル名、およびtarballの実際の親ディレクトリを表すために、いくつかの行を調整する必要があります。 。これが一般的なガイドラインになることを願っています。本当に必要な場合は、ほとんどのシステムコールを再帰的シェルスクリプトに入れることもできますが、個人的には単にシェルスクリプトを作成するのではなく、最初に時間をかけてシェルスクリプトを再帰的にする方が面倒だと思います。 C++ ラッパーです。頑張ってください!

おすすめ記事