req: bash script som unzipper filer fra kataloger

req: bash script som unzipper filer fra kataloger

Innleggav tomsun » man 26.11.2007 0:46

Hei

Noen som har lyst til å laget et lite script til meg?
Jeg har backup av noen zipfiler som ligger innefor et backup directory.
De er navnet noe ala sommerbilder2005.zip, hostbilder2005.zip vinterbilder2005.zip etc ...
Inne i zip fila ligger bildene uten directory struktur.

Så det jeg har gjort til nå er laget et dir ala sommerbilder2005 og unzippet til den katalolgen manuelt ..

La oss si jeg har "noen" backups ...

Kunne tenkte meg et script som leste navnet på zip filen og sammelignet med et dir navn for å så unzippe til den katalogen.
Jeg er lite kjent med awk, grep og regx for å si det mildt.

Jeg vet ikke hvor mye jobb det ligger bak noe sånnt, eller om det er en lett måte å løse dette på.

takk

--
/t
medlem i 222 måneder
 

Re: req: bash script som unzipper filer fra kataloger

Innleggav steinmb » man 26.11.2007 1:20

Ehhh. mulig jeg missforstod deg men er det ikke enklere å zippe dir som ink. filene?
sommerbilder05
- bilde1
- bilde2
- bildexx
Når du da pakker ut zip-filene blir innholdet lagt i korrekt folder. osv.

Brukerens avatar
medlem i 231 måneder
 

Re: req: bash script som unzipper filer fra kataloger

Innleggav tomsun » man 26.11.2007 3:36

Helt klart ... men tenkte jeg så langt da jeg gjorde dette i 2005? ... nei :)
--
/t
medlem i 222 måneder
 

Re: req: bash script som unzipper filer fra kataloger

Innleggav decodex » man 26.11.2007 5:02

Jeg er ingen ekspert på Shell-skripting enda, men tok meg noen minutter til å ta dette som en liten øvelse.

Last ned unzipper.sh

Last ned skriptet og gjør det eksekverbart (chmod a+x unzipper.sh). Skriptet er godt kommentert, men funksjonaliteten skal være noe á la det du ber om. Naviger til mappen med alle zip-filene, og kall på skriptet, så skal skriptet pakke ut zip-filene i undermapper med samme navn (som opprettes om de ikke eksisterer). Skriptet kan også kalles på med argumenter som angir én eller flere mapper med zip-filer i stedet.

Om noen virkelige Shell-guruer skulle ta en titt kunne de sikkert kommet på en bedre/enklere måte å gjøre det på. Selv klarte jeg å halvere skriptet bare med litt ekstra kreativ tenking, og setter pris på å få vite om evt. andre forbedringer :)

Brukerens avatar
medlem i 218 måneder
 

Re: req: bash script som unzipper filer fra kataloger

Innleggav tomsun » man 26.11.2007 15:40

Tusen takk ... den fikset utpakkinga helt fint.

Er det mulig å få kjørt scriptet slik at det selv gikk inn i katalogene?

Som dette:

/bilder
-katalog1
-katalog2
-katalog3

slik at jeg kan kjøre scriptet fra /bilder, så entrer det katalog1, og unzipper - entrer katalog2, og unzipper etc ...

Takk for hjelp

--
/t
medlem i 222 måneder
 

Re: req: bash script som unzipper filer fra kataloger

Innleggav decodex » man 26.11.2007 15:52

Som nevnt kan du angi hvilke mapper den skal gå gjennom ZIP-filer i som argumenter til skriptet. Om du står i bilder-mappen kan du da f.eks. kalle det slik:

Kode: Merk alt
unzipper.sh katalog1 katalog2 katalog3


Eller, om du vil ta alle undermapper i bilder-mappen, rett og slett:

Kode: Merk alt
unzipper.sh *


Om du kaller på skriptet uten argumenter tilsvarer det egentlig:

Kode: Merk alt
unzipper.sh .


Skriptet baserer seg altså på én eller flere mapper som utgangspunkt for å lete etter ZIP-filer i.

Brukerens avatar
medlem i 218 måneder
 

Re: req: bash script som unzipper filer fra kataloger

Innleggav TO » man 26.11.2007 16:54

decodex ba om kritikk på følgende:
Kode: Merk alt
 [$# -eq 0 ] && dirs=`pwd` || dirs=$@

for dir in $dirs; do                  # Gå gjennom hver sti som er oppgitt
   if [ -d $dir ]; then               # Hvis det er en mappe...
      for zip in "$dir"/*.zip; do         # ...gå gjennom alle .zip-filer i mappen
         dest=`basename -s .zip $zip`   # ...finn mappenavn ut i fra filnavn
         `unzip $zip -d "$dir/$dest"`# ...pakk ut til mappe med samme navn som zip-fil
      done
   else                           # Hvis ikke det er en mappe...
      echo "Kilde er ikke mappe: $dir"   # ...rapporter om feil
   fi
done


Syns det er bra, noen bitte små kommentarer som utelukkende er ment konstruktivt :) :
1. Mangler hjelp, f.eks.: if [ $# -eq 0 -o "$1" = "-h" -o "$1" = "--help" ] # skriv hjelp til stdout
2. Hva hvis blank (blanke i argumenter/filnavn)? Tenker på $@ som kanskje bør være "$@", $dir som muligens også bør beskyttes samt $zip.
3. Info: siden du bruker #!/bin/bash kan bakoverfnutter erstattes med $( .... )
4. Info: å gjøre noe når ingen argumenter -- dette er smak og behag og ikke noe problem når programmet er veldokumentert og dokumentasjonen kan finnes på standard måte.
5. Denne: for file in dir/*.zip, hva hvis ingen zip-fil (overraskelse!)
Men nå er jeg forbi hva som er rimelige kommentarer i forhold til noe som ble kastet sammen i en fyk og en fei. Her er utgangspunktet godt og resten av jobben ligger som vanlig i "bullet-proofing" og dokumentasjon.
medlem i 213 måneder
 

Re: req: bash script som unzipper filer fra kataloger

Innleggav decodex » man 26.11.2007 18:28

Tusen takk for tilbakemelding TO!

De to første tingene du nevner har jeg tenkt på, men ikke tatt meg tid til som du sikkert skjønte. Bruk av $(...) fremfor `...` har jeg også nylig fått med meg kan brukes, men er vant til `...` selv. Kan du utdype noen evt. fordeler med $(...)? Og fin feil du oppdaget når ingen zip-filer finnes i mappen(e) :-[

Jeg er nok enig i at «usage» bør skrives ut ved mangel på argumenter, og heller kreve at kildemappe angis. Er jo ikke et skript som bare gir informasjon (som ls f.eks.), men som faktisk oppretter nye filer/mapper. Men skriptet ble skrevet litt mtp. enkelhet i bruk i dette konkrete tilfellet :)

Brukerens avatar
medlem i 218 måneder
 

Re: req: bash script som unzipper filer fra kataloger

Innleggav TO » man 26.11.2007 19:11

Bruker kun $(...) selv, den eneste fordelen jeg kjenner til er at nøsting kan gjøres, f.eks. som i dette meningsløse eksempelet:
Kode: Merk alt
$(
    suffix=zip
    <<EOF cat
    Liste over filer som matsjer *.$suffix:
    $( ls -1 *.$suffix )
EOF
)
medlem i 213 måneder
 

Re: req: bash script som unzipper filer fra kataloger

Innleggav tomsun » man 26.11.2007 20:45

Helt genialt .. dette sparte meg for mye manuelt arbeid. Tusen takk for det.
En lite request på slutten nå, så sparer det mer arbeid. Skulle gjerne ha deletet zipfila etter den er pakket ut.

Takk igjen

--
/t
medlem i 222 måneder
 

Re: req: bash script som unzipper filer fra kataloger

Innleggav decodex » man 26.11.2007 23:03

Kunne vel vært lagt inn i skriptet det også, men det kan du forsåvidt gjøre slik (etter du har verifisert at ting ble pakket ut riktig):

Kode: Merk alt
rm -f *.zip


Husk å tenke gjennom hva du gjør før du kaller på «rm», da dette ikke putter noe i søppelkurven for senere tømming, men sletter umiddelbart. Gjør gjerne en sjekk av filer som vil bli slettet først slik:

Kode: Merk alt
ls *.zip


Du kan også fjerne -f opsjonen og legge til -i opsjonen på rm-kommandoen om du vil ha full kontroll over hva som blir slettet, da vil du bli bedt om å bekrefte sletting av hver eneste fil underveis.
Sist endret av decodex den tir 27.11.2007 0:23, endret 2 ganger.

Brukerens avatar
medlem i 218 måneder
 

Re: req: bash script som unzipper filer fra kataloger

Innleggav TO » tir 27.11.2007 0:15

>Du kan også droppe -f opsjonen ...
>da vil du bli bedt om å bekrefte sletting av hver eneste fil

Har du spesialoppsett av rm? Jeg spør fordi "rm" stort sett aldri ber om verifikasjon hos meg.
medlem i 213 måneder
 

Re: req: bash script som unzipper filer fra kataloger

Innleggav decodex » tir 27.11.2007 0:22

Pokker, der ser du hvor ofte jeg bruker rm... Bruker det tydeligvis oftest på filer som ikke er vanlig å navigere til i Finder, og derav gjerne har litt andre rettigheter. Korrigert til anbefaling av opsjon for tvungen bekreftelse per fil i stedet :)

Brukerens avatar
medlem i 218 måneder
 


Returner til Scripting



Hvem er i Forumene

Registrerte brukere: Google [Bot]



cron