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.
Per un esame devo realizzare uno script bash che cambi le estensioni dei file (puro cambiamento del nome, nessuna conversione). È tutto pronto e funzionante, a parte un piccolo dettaglio che mi manda in bestia. Ecco lo spezzone di codice che mi da problemi:
for nomefile in $guardia_for # esegue la rinomina sui file
# il for considera gli elementi della lista come separati dallo spazio: ogni parola viene considerata come un file diverso...
do # rinomina, se possibile, il file $nomefile con la nuova estensione $est_dest
temp_name="$temp_name $nomefile" # concateno i nomi (con questo metodo aggiungo uno spazio prima del nome del file)
temp_est="${temp_name:(-${#est_orig})}"
echo "$temp_est == $est_orig"
if [ "$temp_est"=="$est_orig" ] # sembra che restituisca sempre vero...
then
temp_name=${temp_name#" "} # rimuovo lo spazio iniziale
mv "$temp_name" "${temp_name%.$est_orig}.$est_dest"
temp_name=""
else #non finisce con estensione, bisogna iterare
echo "$temp_name non ha estensione"
continue
fi
done
Il problema si presente nell'if. Quando arrivo in questa parte del programma, $nomefile contiene la lista dei file da processare. Il problema è che la bash considera come separatore per le liste il carattere "spazio", e quindi i nomi di file composti da più parole vengono considerati come file diversi, un file per parola. L'if deve verificare se la parola in esame termina effettivamente con un'estensione. Se così è, allora è un file e va rinominato, altrimenti a questa parola si aggiungono le parole seguenti fino a completare il nome del file. Il guaio è che il confronto non funziona. Devo confrontare semplicemente le due stringhe $temp_est e $est_orig e vedere se sono uguali, ma anche se sono diversi il risultato è sempre e comunque che sono uguali. Le stringhe sono corrette e contengono i caratteri appropriati. L'unico problema è nell'if... Qualcuno può suggerirmi un metodo per confrontare decentemente le stringhe di caratteri in bash??? Ho letto e riletto Advance Bash Scripting ma non ho risolto nulla
Ultima modifica di Delcaran Lëdeloth il dom 14 giu 2009, 20:35, modificato 1 volta in totale.
Avevo scritto una cosa ma poi, rileggendo, mi è sorto il dubbio che non c'entrasse niente... Qui è spiegato un modo per risolvere in caso di spazi nei nomi, vedi se ti può aiutare
Delcaran Lëdeloth ha scritto:Per un esame devo realizzare uno script bash che cambi le estensioni dei file (puro cambiamento del nome, nessuna conversione). È tutto pronto e funzionante, a parte un piccolo dettaglio che mi manda in bestia. Ecco lo spezzone di codice che mi da problemi:
for nomefile in $guardia_for # esegue la rinomina sui file
# il for considera gli elementi della lista come separati dallo spazio: ogni parola viene considerata come un file diverso...
do # rinomina, se possibile, il file $nomefile con la nuova estensione $est_dest
temp_name="$temp_name $nomefile" # concateno i nomi (con questo metodo aggiungo uno spazio prima del nome del file)
temp_est="${temp_name:(-${#est_orig})}"
echo "$temp_est == $est_orig"
if [ "$temp_est"=="$est_orig" ] # sembra che restituisca sempre vero...
then
temp_name=${temp_name#" "} # rimuovo lo spazio iniziale
mv "$temp_name" "${temp_name%.$est_orig}.$est_dest"
temp_name=""
else #non finisce con estensione, bisogna iterare
echo "$temp_name non ha estensione"
continue
fi
done
Il problema si presente nell'if. Quando arrivo in questa parte del programma, $nomefile contiene la lista dei file da processare. Il problema è che la bash considera come separatore per le liste il carattere "spazio", e quindi i nomi di file composti da più parole vengono considerati come file diversi, un file per parola. L'if deve verificare se la parola in esame termina effettivamente con un'estensione. Se così è, allora è un file e va rinominato, altrimenti a questa parola si aggiungono le parole seguenti fino a completare il nome del file. Il guaio è che il confronto non funziona. Devo confrontare semplicemente le due stringhe $temp_est e $est_orig e vedere se sono uguali, ma anche se sono diversi il risultato è sempre e comunque che sono uguali. Le stringhe sono corrette e contengono i caratteri appropriati. L'unico problema è nell'if... Qualcuno può suggerirmi un metodo per confrontare decentemente le stringhe di caratteri in bash??? Ho letto e riletto Advance Bash Scripting ma non ho risolto nulla
string1 == string2
True if the strings are equal. = may be used in place of == for strict POSIX compliance.
Mario figurati, ma dipende dalla "notazione".
Quella originale dice [[ string1 == string2 ]], e come vedi c'è lo spazio cosa che comunque lui non ha messo!
Poi c'è una versione delle condizioni semplificata (e standardizzata POSIX), che permette di usare una sola parentesi e un solo (ma anche due) uguale, [ string1 = string2 ],
Ma c'è sempre lo spazio, spazio che anche tu hai "citato". Gl'ho dato la versione corretta della notazione che ha scelto.
rock
Mario Vanoni ha scritto:Non trovo da nessuna parte che due
${Shell Parameter Expansion}
siano impilabili (can be nested).
Forse devi farlo in due passi.
temp_est="${temp_name:(-${#est_orig})}"
Non è che impilo, semplicemente concateno due stringhe questa parte funziona
Qui è spiegato un modo per risolvere in caso di spazi nei nomi, vedi se ti può aiutare
Mi ha aiutato, grazie mille avevo provato tutte le sintassi di confronto, ma mi dava sempre e comunque lo stesso errore...
Ora ho risolto tutto, ecco la funzione definitiva!
function rename_extensions () {
if [[ $1 == 0 ]] # verifica se e' stata richiesta la ricorsione nelle directory
then
for nomefile in *.$est_orig # esegue la rinomina sui file
do # rinomina, se possibile, il file $nomefile con la nuova estensione $est_dest
mv "$nomefile" "${nomefile%.$est_orig}.$est_dest"
done
else # effettua ricorsione
find . -name "*.$est_orig" -print0 | while read -r -d $'\0' f; do
mv "$f" "${f%.$est_orig}.$est_dest"
done
fi
}