Ta bort och lägg till specifik fil i tar.gz-arkiv

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
Pinky
Inlägg: 1258
Blev medlem: 30 jan 2007, 15:59
OS: Fedora
Ort: Kristianstad/Sverige
Kontakt:

Ta bort och lägg till specifik fil i tar.gz-arkiv

Inlägg av Pinky »

Hej!

Jag har en tar.gz-fil. Nu vill jag ta bort en specifik fil i detta arkiv.
Mitt arkiv, deploy.tar.gz är packad med -P flaggan, dvs preserve absolute path.
Mitt arkiv ligger i /mnt/Deployment/deploy.tgz och filen jag vill ta bort finns i "/mnt/disk1/jboss-3.0.6/server/default/deploy" i arkivet.
Fråga ett är hur jag tar bort en fil öht i ett sådant arkiv (jag vill scripta detta senare):
Jag har provat med

Kod: Markera allt

tar -zf /mnt/Deployment/deploy.tar.gz --delete /mnt/disk1/jboss-3.0.6/server/default/deploy/deploy-20100304_1316.ear
Men får bara resultatet "Aborted" ???

Fråga två är, tidsstämpeln i namnet på denna fil är inte alltid likadan. Finns något smidigt sätt att använda sig av wildcards för att ta bort alla filer som heter deploy-*? Detta kan jag eventuellt lösa på annat sätt i script, så fråga 1 är det primära :)

Mvh
Martin
Användarvisningsbild
Pinky
Inlägg: 1258
Blev medlem: 30 jan 2007, 15:59
OS: Fedora
Ort: Kristianstad/Sverige
Kontakt:

Re: Ta bort specifik fil i tar.gz-arkiv

Inlägg av Pinky »

Uppdatering:
Om jag "packar upp" arkivet med gunzip, så att jag bara har en tar-fil istället för tar.gz så funkar det tutmärkt att ta bort filen. Kan förvisso använda denna workaround, men det känns onödigt krångligt. Finns inget coolare sätt? ;)
Användarvisningsbild
Pinky
Inlägg: 1258
Blev medlem: 30 jan 2007, 15:59
OS: Fedora
Ort: Kristianstad/Sverige
Kontakt:

Re: Ta bort specifik fil i tar.gz-arkiv

Inlägg av Pinky »

Nytt problem så länge: Nu vill jag lägga till en ny deploy-fil i mitt tar-arkiv.
Något i stil med:

Kod: Markera allt

tar -f /mnt/Deployment/deploy.tar/mnt/disk1/jboss-3.0.6/server/default/deploy/ -r ~/ant/projekt/dist/deploy-20100308_1656.ear 
Obs! Det kommandot funkar alltså inte.
Jag har alltså inte en filstruktur lokalt som liknar den i tar-filen, och jag slipper gärna att skapa den.

Långa förklaringen:
Min deploy-<datum>_<tid>.ear-fil är en mjukvara som byggs lokalt (java byggt av ant, därav ~/ant-mappen). tar-filen är en backup från en server som ska köra mjukvaran.
Vi har redan script som både backar ut backupper i tar-filer och som kan stoppa in dem igen. Vad jag vill göra är alltså att ta en backup, ta bort det som jag ska ersätta, lägga in det nya och sedan kunna kasta in det mha det befintliga backup/restore-systemet.
Användarvisningsbild
Rag3Rac3r
Inlägg: 594
Blev medlem: 05 jul 2007, 03:06
OS: Windows
Utgåva: Vet inte/ingen utgåva passar
Ort: Uppsala/Stockholm
Kontakt:

Re: Ta bort specifik fil i tar.gz-arkiv

Inlägg av Rag3Rac3r »

Pinky skrev:Nytt problem så länge: Nu vill jag lägga till en ny deploy-fil i mitt tar-arkiv.
Något i stil med:

Kod: Markera allt

tar -f /mnt/Deployment/deploy.tar/mnt/disk1/jboss-3.0.6/server/default/deploy/ -r ~/ant/projekt/dist/deploy-20100308_1656.ear 
Obs! Det kommandot funkar alltså inte.
Jag har alltså inte en filstruktur lokalt som liknar den i tar-filen, och jag slipper gärna att skapa den.

Långa förklaringen:
Min deploy-<datum>_<tid>.ear-fil är en mjukvara som byggs lokalt (java byggt av ant, därav ~/ant-mappen). tar-filen är en backup från en server som ska köra mjukvaran.
Vi har redan script som både backar ut backupper i tar-filer och som kan stoppa in dem igen. Vad jag vill göra är alltså att ta en backup, ta bort det som jag ska ersätta, lägga in det nya och sedan kunna kasta in det mha det befintliga backup/restore-systemet.
Kan du inte skapa ett "fakat" filsystem i tmp då? Och därifrån ändra till det du behöver i filen.
Natural laws have no pity ~~ Quis custodiet ipsos custodes?
Användarvisningsbild
Pinky
Inlägg: 1258
Blev medlem: 30 jan 2007, 15:59
OS: Fedora
Ort: Kristianstad/Sverige
Kontakt:

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv

Inlägg av Pinky »

Tyvärr inte (eller?).
I tar-arkivet ska filen in i "/mnt/......" men om jag skapar mitt filsystem i /tmp så kommer ju sökvägen att bli "/tmp/mnt/..."
Användarvisningsbild
Pinky
Inlägg: 1258
Blev medlem: 30 jan 2007, 15:59
OS: Fedora
Ort: Kristianstad/Sverige
Kontakt:

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv

Inlägg av Pinky »

Jag fick den här länken av rag3rac3r: http://ftp.sunet.se/pub/os/Linux/distri ... ts/makepkg som är slackwares makepkg-script då de använder tar.gz som installationspaket.
Jag förstår ungeför 50% av vad som står i den och hittar inget som hjälper mig direkt.

Däremot så kom jag på tanken: kan man köra chroot på något vis och lura tar att /tmp/ är rooten istället?
Användarvisningsbild
Pinky
Inlägg: 1258
Blev medlem: 30 jan 2007, 15:59
OS: Fedora
Ort: Kristianstad/Sverige
Kontakt:

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv

Inlägg av Pinky »

Örk, vad krångligt det ska vara då. :-\
Jag har kopierat alla bibliotek som tar behöver (listade dem med hjälp av ldd) till /tmp/lib. Jag har kopierat tar-programmet till /tmp/.
Jag har lagt .ear-filen (den som ska in i arkivet) i /tmp/mnt/disk1/jboss.../ (unt so weiter)
När jag försöker köra

Kod: Markera allt

sudo chroot /tmp tar -f /deploy.tar -r /mnt/disk1/jboss.../deploy-20100308_1656.ear
så får jag svaret:

Kod: Markera allt

chroot: cannot run command `tar': No such file or directory
Användarvisningsbild
Rag3Rac3r
Inlägg: 594
Blev medlem: 05 jul 2007, 03:06
OS: Windows
Utgåva: Vet inte/ingen utgåva passar
Ort: Uppsala/Stockholm
Kontakt:

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv

Inlägg av Rag3Rac3r »

Pinky skrev:Örk, vad krångligt det ska vara då. :-\
Jag har kopierat alla bibliotek som tar behöver (listade dem med hjälp av ldd) till /tmp/lib. Jag har kopierat tar-programmet till /tmp/.
Jag har lagt .ear-filen (den som ska in i arkivet) i /tmp/mnt/disk1/jboss.../ (unt so weiter)
När jag försöker köra

Kod: Markera allt

sudo chroot /tmp tar -f /deploy.tar -r /mnt/disk1/jboss.../deploy-20100308_1656.ear
så får jag svaret:

Kod: Markera allt

chroot: cannot run command `tar': No such file or directory
Jag ska kika en snabbis på makepkg ifrån Slackware senare, se om jag kan rippa ut innehållet ifrån den.
Annars kan du ju kika på rpmbuild som också gör samma eller liknande sak. :)
Natural laws have no pity ~~ Quis custodiet ipsos custodes?
Användarvisningsbild
Rag3Rac3r
Inlägg: 594
Blev medlem: 05 jul 2007, 03:06
OS: Windows
Utgåva: Vet inte/ingen utgåva passar
Ort: Uppsala/Stockholm
Kontakt:

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv

Inlägg av Rag3Rac3r »

Pinky skrev:Örk, vad krångligt det ska vara då. :-\
Jag har kopierat alla bibliotek som tar behöver (listade dem med hjälp av ldd) till /tmp/lib. Jag har kopierat tar-programmet till /tmp/.
Jag har lagt .ear-filen (den som ska in i arkivet) i /tmp/mnt/disk1/jboss.../ (unt so weiter)
Det är nog denna raden du är ute efter:
$TAR cvf - . | gzip -9c > ${TARGET_NAME}/${TAR_NAME}.${EXTENSION}

tar cvf - . | gzip -9z > dinfil.tar.gz

Så detta script borde funka:

Kod: Markera allt

#!/bin/bash
cwd = $(pwd)
mkdir -r /tmp/Deployment/deploy.tar/mnt/disk1/jboss-3.0.6/server/default/deploy/
cd /tmp/Deployment/deploy.tar/mnt/disk1/jboss-3.0.6/server/default/deploy/
rm -rf deploy.tar.gz
cp $cwd/filerna som ska in
tar cvf - . | gzip -9c > deploy.tar.gz
Modifiera efter behov. :)
Den gör bara om hela paketet, men du kör med ett kommando.
Om du vill använda "script nagonting" så den använder som argument vad gäller filnamnen lägg bara till $1 på lämligt ställe ($0 är programnamnet, $1 är första "parametern")
Natural laws have no pity ~~ Quis custodiet ipsos custodes?
Användarvisningsbild
Pinky
Inlägg: 1258
Blev medlem: 30 jan 2007, 15:59
OS: Fedora
Ort: Kristianstad/Sverige
Kontakt:

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv

Inlägg av Pinky »

nu hänger jag inte med på ditt script:
vi sätter variabeln "cwd" till mappen varifrån scriptet körs.
sedan skapar vi vår filstruktur i /tmp/, fast med deploy.tar mitt i??
sedan går vi in i mappen.
sedan tar vi bort vår tar.gz-fil? (hur kom den dit från första början, vi skapade ju precis mappen?)
sedan kopierar vi filerna som ska läggas, på rätt plats i vår filstruktur.
sedan packar vi mappen som vi står i till ett arkiv? hur kommer resten av filstrukturen med då, och hur slipper vi /tmp/ i den?

Sorry, men jag är lite lost för tillfället :)
Användarvisningsbild
Rag3Rac3r
Inlägg: 594
Blev medlem: 05 jul 2007, 03:06
OS: Windows
Utgåva: Vet inte/ingen utgåva passar
Ort: Uppsala/Stockholm
Kontakt:

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv

Inlägg av Rag3Rac3r »

Pinky skrev:nu hänger jag inte med på ditt script:
vi sätter variabeln "cwd" till mappen varifrån scriptet körs.
sedan skapar vi vår filstruktur i /tmp/, fast med deploy.tar mitt i??
sedan går vi in i mappen.
sedan tar vi bort vår tar.gz-fil? (hur kom den dit från första början, vi skapade ju precis mappen?)
sedan kopierar vi filerna som ska läggas, på rätt plats i vår filstruktur.
sedan packar vi mappen som vi står i till ett arkiv? hur kommer resten av filstrukturen med då, och hur slipper vi /tmp/ i den?

Sorry, men jag är lite lost för tillfället :)

Kod: Markera allt

#!/bin/bash
code=$(pwd)
rm -rf /tmp/Depoyment
mkdir -r /tmp/Deployment/mnt/disk1/jboss-3.0.6/server/default/deploy/
cd /tmp/Depoyment
tar xzvf gammal.deploy.tar.gz
rm -rf gammal.deploy.tar.gz
cp -rf $code/ /tmp/Deployment/mnt/disk1/jboss-3.0.6/server/default/deploy/
tar cvf - . | gzip -9c > deploy.tar.gz
Sry, lite fel först. Men detta gör den:
1. Spar mappen vi står i (förutsatt att det är den "filen" som innehåller allt som ska in i arkivet)
2. Ta bort ev. gammal struktur (utan felmeddelanden om d inte finns en gammal)
2. Skapa vår "tillfälliga" struktur i tmp
3. Byt mapp till tmp/Deployment
4. Packa upp den gamla tar-filen
5. ta bort den gamla tar-filen
6. Kopiera in koden ifrån mappen du stod i (recursive utifall den innehåller mappar, och force för att skriva över nya filer)
7. packa ihop till en ny deploy.tar.gz

Eventuellt kan "tar xzvf" behöva modifieras så den packar upp rätt, och inte i rooten i ditt filsystem.
Ska testköra denna nu i en CentOS vm, och se om det funkar. :)

Om det är konstant samma mapp kan du ändra "code=$(pwd)" till "code=/mappen/ifråga"
Natural laws have no pity ~~ Quis custodiet ipsos custodes?
Användarvisningsbild
Pinky
Inlägg: 1258
Blev medlem: 30 jan 2007, 15:59
OS: Fedora
Ort: Kristianstad/Sverige
Kontakt:

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv

Inlägg av Pinky »

Tack, nu begriper jag lite bättre :) Ska testa detta imorgon, då jag måste iväg nu.
Hör av mig och berättar hur det går!

Mvh
Martin
Användarvisningsbild
Rag3Rac3r
Inlägg: 594
Blev medlem: 05 jul 2007, 03:06
OS: Windows
Utgåva: Vet inte/ingen utgåva passar
Ort: Uppsala/Stockholm
Kontakt:

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv

Inlägg av Rag3Rac3r »

Pinky skrev:Tack, nu begriper jag lite bättre :) Ska testa detta imorgon, då jag måste iväg nu.
Hör av mig och berättar hur det går!

Mvh
Martin
[root@localhost ~]# ./pinky.sh
Extract old archive that needs filechange
./
./mnt/
./mnt/disk1/
./mnt/disk1/jboss-3.0.6/
./mnt/disk1/jboss-3.0.6/server/
./mnt/disk1/jboss-3.0.6/server/default/
./mnt/disk1/jboss-3.0.6/server/default/deploy/
./mnt/disk1/jboss-3.0.6/server/default/deploy/deploy-20030106_1600.ear
./mnt/disk1/jboss-3.0.6/server/default/deploy/fil2
./mnt/disk1/jboss-3.0.6/server/default/deploy/fil3-new
./mnt/disk1/jboss-3.0.6/server/default/deploy/fil4
./mnt/disk1/jboss-3.0.6/server/default/deploy/fil1
Repack the archive with the new file in place
./
./mnt/
./mnt/disk1/
./mnt/disk1/jboss-3.0.6/
./mnt/disk1/jboss-3.0.6/server/
./mnt/disk1/jboss-3.0.6/server/default/
./mnt/disk1/jboss-3.0.6/server/default/deploy/
./mnt/disk1/jboss-3.0.6/server/default/deploy/fil2
./mnt/disk1/jboss-3.0.6/server/default/deploy/fil3-new
./mnt/disk1/jboss-3.0.6/server/default/deploy/deploy-20030106_1700.ear
./mnt/disk1/jboss-3.0.6/server/default/deploy/fil4
./mnt/disk1/jboss-3.0.6/server/default/deploy/fil1
Om du kan ändra backupscriptet till "tar -xzvf deploy.tar.gz -C /" så kommer detta scriptet funka finemang :D

Testat detta ett par gånger, och det funkar utmärkt. Det slutgiltiga scriptet blev:

Kod: Markera allt

#!/bin/bash
code=/root/pinky/
rm -rf /tmp/Deployment >/dev/null 2>&1
mkdir -p /tmp/Deployment/mnt/disk1/jboss-3.0.6/server/default/deploy/
echo "Extract old archive that needs filechange"
tar xzvf /root/deploy.tar.gz -C /tmp/Deployment
rm -rf deploy.tar.gz
rm -rf /tmp/Deployment/mnt/disk1/jboss-3.0.6/server/default/deploy/deploy-*.ear
cp -rf $code/* /tmp/Deployment/mnt/disk1/jboss-3.0.6/server/default/deploy/
echo "Repack the archive with the new file in place"
cd /tmp/Deployment
tar cvf - . | gzip -9c > /root/deploy.tar.gz
Du kan nog trycka ner det lite om du vill ;)

Step by step:
1. --
2. Fast definierad mapp som innehåller nya deploy-*.ear
3. Ta bort gamla "fusk"-strukturen i /tmp
4. Återskapa "fusk"-strukturen
5. --
6. Packa upp det gamla arkivet som behöver deploy-*.ear filen ersatt
7. Ta bort det gamla arkivet (kan nog skippas, men orkade inte testa)
8. Ta bort den gamla deploy-*.ear filen
9. kopiera in den nya deploy-*.ear filen (körde wildvard på den i mitt test)
10. --
11. Byt mapp till "fusk"-strukturen i /tmp (denna kanske kan bytas ut eller tas bort om man kommer på en bra smart lösning på nästa rad)
12. Packa ihop en ny deploy.tar.gz fil med utbytt deploy-*.ear

Inte världens mest eleganta lösning, men i brist på en bra oneliner så funkar detta scriptet utmärkt, och går att bygga ut med :)
Natural laws have no pity ~~ Quis custodiet ipsos custodes?
Användarvisningsbild
Pinky
Inlägg: 1258
Blev medlem: 30 jan 2007, 15:59
OS: Fedora
Ort: Kristianstad/Sverige
Kontakt:

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv

Inlägg av Pinky »

Funkar NÄSTAN :D

Den packade filen osm blir "resultatet" har följande fel:
Mappstrukturen i den börjar med "." och inte "/". Jag har altså "./mnt/disk1/..." när jag bara vill ha "/mnt/disk1"
Jag har använt -p flaggan när jag packade arkivet från början, remember?
Jag har en hög installationsscript som är beroende av att strukturen i paketet ser ut så :)
Användarvisningsbild
Rag3Rac3r
Inlägg: 594
Blev medlem: 05 jul 2007, 03:06
OS: Windows
Utgåva: Vet inte/ingen utgåva passar
Ort: Uppsala/Stockholm
Kontakt:

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv

Inlägg av Rag3Rac3r »

Pinky skrev:Funkar NÄSTAN :D

Den packade filen osm blir "resultatet" har följande fel:
Mappstrukturen i den börjar med "." och inte "/". Jag har altså "./mnt/disk1/..." när jag bara vill ha "/mnt/disk1"
Jag har använt -p flaggan när jag packade arkivet från början, remember?
Jag har en hög installationsscript som är beroende av att strukturen i paketet ser ut så :)
Installations scriptet kan tweakas genom att när dom packas upp använder "tar xzvf deploy.tar.gz -C /", på det sättet så märks inte "./" av.
Ska fortsätta kika på en lösning i såna fall, så att det går att köra den rakt av utan moddning av installationsscripten om du inte ser det som en lösning. (hittade -C flaggan igår i 'man tar', fan vad smidig flagga :D funkar inte med packningen dock :( )
Natural laws have no pity ~~ Quis custodiet ipsos custodes?
Skriv svar

Återgå till "Terminalforum"