Repository 32bit  Forum
Repository 64bit  Wiki

Bash [totale neofita] - Creazione script estrazione universa

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

Bash [totale neofita] - Creazione script estrazione universa

Messaggioda Blallo » sab mar 13, 2010 0:59

Vorrei creare uno scriptino in bash per estrarre archivi
come faccio a riconoscere l'estensione del file tramite uno script bash?
Ultima modifica di Blallo il sab mar 13, 2010 19:35, modificato 1 volta in totale.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3213
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: Bash [totale neofita] - Creazioen script estrazione universa

Messaggioda d4z_c0nf » sab mar 13, 2010 1:11

jimmy_page_89 ha scritto:Vorrei creare uno scriptino in bash per estrarre archivi
come faccio a riconoscere l'estensione del file tramite uno script bash?

Codice: Seleziona tutto
${filename##*.}



Così prendi solo l'estensione, ovviamente l'ultima. Nel senso, sia che sia tar.gz o un .gz o .zip prendi solo gz.

Insomma ti ho dato un input, ora sta a te andare ad approfondire l'uso degli operatori
{#} e {%} .

;)
Avatar utente
d4z_c0nf
Packager
Packager
 
Messaggi: 1293
Iscritto il: mar mar 14, 2006 18:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce

Re: Bash [totale neofita] - Creazioen script estrazione universa

Messaggioda sardylan » sab mar 13, 2010 1:36

Passa il nome del file al comando "file", e poi usa grep per decidere cosa fare...
Fai delle prove dirette per vedere il tipo di output...

Piccolo esempio preso dal mio SlackBuild tipo:
Codice: Seleziona tutto
if file "${CWD}/${SRC_FILENAME}" | grep "bzip2" ; then
    tar xjvf "${CWD}/${SRC_FILENAME}" || exit 1
elif file "${CWD}/${SRC_FILENAME}" | grep "gzip" ; then
    tar xzvf "${CWD}/${SRC_FILENAME}" || exit 1
elif file "${CWD}/${SRC_FILENAME}" | grep "Zip" ; then
    unzip "${CWD}/${SRC_FILENAME}" || exit 1
else
    echo "ERROR"
    echo "Archive file-type unknown"
    exit 1
fi
Avatar utente
sardylan
Linux 2.6
Linux 2.6
 
Messaggi: 993
Iscritto il: mar apr 24, 2007 8:21
Località: Cagliari
Nome Cognome: Luca Cireddu
Slackware: current 64bits
Kernel: 3.16
Desktop: KDE 4.5.5
Distribuzione: Debian - CLFS

Re: Bash [totale neofita] - Creazioen script estrazione universa

Messaggioda Ansa89 » sab mar 13, 2010 11:59

Credo ci sia un errore nel tuo script: tu usi sempre il comando tar, dando per scontato che l'archivio sia *.tar.[bz2,gz].
Questo non è sempre vero: il file potrebbe essere semplicemente compresso come gzip (bzip2), senza per forza essere un tape archive.
Avatar utente
Ansa89
Iper Master
Iper Master
 
Messaggi: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: Bash [totale neofita] - Creazioen script estrazione universa

Messaggioda Mario Vanoni » sab mar 13, 2010 14:34

Per *.bz2:
find -name '*.bz2'
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: Bash [totale neofita] - Creazioen script estrazione universa

Messaggioda sardylan » sab mar 13, 2010 19:40

Ansa89 ha scritto:Credo ci sia un errore nel tuo script: tu usi sempre il comando tar, dando per scontato che l'archivio sia *.tar.[bz2,gz].
Questo non è sempre vero: il file potrebbe essere semplicemente compresso come gzip (bzip2), senza per forza essere un tape archive.

Si... E' vero... Solo che quella parte, come ho detto, fa parte degli SlackBuilds, e più che altro va per gli archivi dei sorgenti... Comunque cio che contra è il principio di funzionamento... Infatti ho detto di fare delle prove con il comando per vedere che tipo di output restituisce il comando "file"...
Avatar utente
sardylan
Linux 2.6
Linux 2.6
 
Messaggi: 993
Iscritto il: mar apr 24, 2007 8:21
Località: Cagliari
Nome Cognome: Luca Cireddu
Slackware: current 64bits
Kernel: 3.16
Desktop: KDE 4.5.5
Distribuzione: Debian - CLFS

Re: Bash [totale neofita] - Creazione script estrazione universa

Messaggioda albatrosla » dom mar 14, 2010 11:11

Usare il comando "file" è certamente la cosa migliore, potendosi così slegare dal problema di isolare l'estensione completa dal nome del file (in questo modo si è sufficientemente flessibili da poter estrarre anche file con nomi contenenti ".", che potrebbero facilmente indurre in errore lo script). Il problema delle compressioni multiple (tar.bz2, ad es.) è che "file" ti restituisce solo l'ultima compressione (nella fattispecie bz2). Perciò è utile fare un loop che controlla se ci sono ulteriori compressioni e continua ad estrarre col tool opportuno fintanto che trova un file compresso (in questo modo si potrebbe estrarre qualcosa tipo rar.tar.gz.bz2 se qualche malato si è prestato ad un tanto inutile quanto diabolico artificio).
Dunque, io userei qualcosa di simile a questo:
Codice: Seleziona tutto
current_filename = $1

function recheck {
if `echo $current_filename | grep -q "\."`
 then   
  current_filename = `echo current_filename | sed s/\.[a-zA-Z0-9]*$//`
 else
 re-check = 0
fi
}

while [[ re-check != 0 ]]
do
 filetype = `file $current_filename | cut -d':' -f2 | cut -d' ' -f1`
 case filetype in
  tar) untar $current_filename;;
  bzip2) bunzip2 $current_filename;;
  *) exit;;
 esac
 recheck
done

E' chiaro che devi aggiungere alla lista dei "case" tutti i casi possibili.

P.S. Il suddetto script (se non ha altri errori, visto che è stato scritto in 1 minuto, a sentimento) si basa sul fatto che l'estensione sia scritta in forma tradizionale (es. tar.bz2, tar, tar.gz, rar, etc... Nulla può con i file nominati in modo ostrogoto (ad es. l'estensione tgz utilizzata come contrazione di tar.gz).
albatrosla
Packager
Packager
 
Messaggi: 1294
Iscritto il: sab mar 27, 2004 0:00
Località: Bressa - Friuli / Torino
Slackware: current
Desktop: fluxbox.git

Re: Bash [totale neofita] - Creazione script estrazione universa

Messaggioda Ansa89 » dom mar 14, 2010 11:26

Il comando "untar" non credo esista (almeno sul mio sistema).

albatrosla ha scritto:Nulla può con i file nominati in modo ostrogoto (ad es. l'estensione tgz utilizzata come contrazione di tar.gz).

Per evitare questo problema si può usare l'output del comando "file" (come hai detto anche tu).
Avatar utente
Ansa89
Iper Master
Iper Master
 
Messaggi: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Exabot [Bot] e 4 ospiti