Eu acho que isso seria melhor resolvido com um programa recursivo, infelizmente eu sou ruim em criar scripts shell recursivos, então eu vou recomendar um programa C ++. A formatação não é padrão, usa goto declarações e faz muitas chamadas do sistema, mas fará o trabalho. Como as informações não foram fornecidas, isso supõe que todos os tarballs estão usando .tar como sufixo, todos os tarballs são gzip (facilmente corrigíveis se isso não for verdade) e que o nome do arquivo que precisa ser excluído é o mesmo em todos os dos tarballs.
#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;}}
Peço desculpas pela falta de formatação horizontal, mas não consegui encontrar uma maneira de fazer isso sem fornecer uma estrutura de lista. Diversas variáveis usadas neste código são espaços reservados, e você pode precisar ajustar certas linhas para considerar o diretório de trabalho que você quer que o programa use, o nome do arquivo que precisa ser excluído dos tarballs e o diretório pai real do arquivo. os tarballs. Espero que isso funcione como uma diretriz geral. Se você realmente quiser, você também pode pegar a maioria das chamadas do sistema e soltá-las em um script de shell recursivo, mas eu pessoalmente acho que tomar um tempo para fazer um script de shell recursivo é mais um aborrecimento do que simplesmente fazer uma Invólucro C ++ para ele. Boa sorte!