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