Excluindo um arquivo específico de dentro de um arquivo tar [duplicado]

2

Eu tenho que excluir os arquivos que são compactados e, em seguida, armazenados no formato .tar. Eu tenho que descompactar os arquivos, em seguida, exclua os arquivos que o nome inclui XXX, YYY ou ZZZ. Existem mais de mil arquivos .tar e cada arquivo .tar contém centenas de arquivos .zip.Eu preciso de um script que possa fazer isso.

    
por Rick 28.02.2017 / 15:46

1 resposta

-1

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!

    
por 28.02.2017 / 22:32