Sida 1 av 1
Ta bort och lägg till specifik fil i tar.gz-arkiv
Postat: 09 mar 2010, 12:34
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
Re: Ta bort specifik fil i tar.gz-arkiv
Postat: 09 mar 2010, 12:58
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?

Re: Ta bort specifik fil i tar.gz-arkiv
Postat: 09 mar 2010, 14:05
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.
Re: Ta bort specifik fil i tar.gz-arkiv
Postat: 09 mar 2010, 14:48
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.
Re: Ta bort och lägg till specifik fil i tar.gz-arkiv
Postat: 09 mar 2010, 16:21
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/..."
Re: Ta bort och lägg till specifik fil i tar.gz-arkiv
Postat: 10 mar 2010, 08:45
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?
Re: Ta bort och lägg till specifik fil i tar.gz-arkiv
Postat: 10 mar 2010, 09:16
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
Re: Ta bort och lägg till specifik fil i tar.gz-arkiv
Postat: 10 mar 2010, 14:18
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.

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv
Postat: 10 mar 2010, 15:44
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")
Re: Ta bort och lägg till specifik fil i tar.gz-arkiv
Postat: 10 mar 2010, 16:13
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

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv
Postat: 10 mar 2010, 16:37
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"
Re: Ta bort och lägg till specifik fil i tar.gz-arkiv
Postat: 10 mar 2010, 17:05
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
Re: Ta bort och lägg till specifik fil i tar.gz-arkiv
Postat: 10 mar 2010, 17:38
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
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

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv
Postat: 11 mar 2010, 08:33
av Pinky
Funkar NÄSTAN
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å

Re: Ta bort och lägg till specifik fil i tar.gz-arkiv
Postat: 11 mar 2010, 13:34
av Rag3Rac3r
Pinky skrev:Funkar NÄSTAN
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

funkar inte med packningen dock

)