Pagina 1 di 1

Bash [totale neofita] - Creazione script estrazione universa

Inviato: sab 13 mar 2010, 0:59
da Blallo
Vorrei creare uno scriptino in bash per estrarre archivi
come faccio a riconoscere l'estensione del file tramite uno script bash?

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

Inviato: sab 13 mar 2010, 1:11
da d4z_c0nf
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 {%} .

;)

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

Inviato: sab 13 mar 2010, 1:36
da sardylan
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

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

Inviato: sab 13 mar 2010, 11:59
da Ansa89
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.

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

Inviato: sab 13 mar 2010, 14:34
da Mario Vanoni
Per *.bz2:
find -name '*.bz2'

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

Inviato: sab 13 mar 2010, 19:40
da sardylan
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"...

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

Inviato: dom 14 mar 2010, 11:11
da albatrosla
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).

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

Inviato: dom 14 mar 2010, 11:26
da Ansa89
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).