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++ 래퍼입니다. 행운을 빌어요!

관련 정보