Pagina 2 di 4
Re: Script complesso per rinominare grandi quantità di file
Inviato: sabato 8 settembre 2012, 18:18
da Laycastle
Ciao,
sono stato assente un bel po' dal forum, se ti serve ancora dimmelo che riprendo in mano lo script.
Re: Script complesso per rinominare grandi quantità di file
Inviato: sabato 22 settembre 2012, 9:30
da King84
Ciao,
sì sono ancora fermo al punto di partenza, ne' so come andare avanti.
Mi insegneresti per favore a creare questo script? Grazie
Re: Script complesso per rinominare grandi quantità di file
Inviato: sabato 20 ottobre 2012, 15:13
da King84
E' passato un altro mese... Io sono sempre fermo al 28/06, al punto di partenza. Qualcuno sa dirmi qualcosa per come creare questo smplice script?
Grazie
Re: Script complesso per rinominare grandi quantità di file
Inviato: giovedì 22 novembre 2012, 11:34
da King84
Ancora un altro mese è passato... nessuna novità riguardo alla creazione di questo script?
Grazie!
Re: Script complesso per rinominare grandi quantità di file
Inviato: giovedì 22 novembre 2012, 13:08
da crap0101
mi sembra che quello scritto da Laycastle faccia quello che chiedi, a parte controllare il caso di rinominazione con file già esistenti.
Per quello basterebbe aggiungere al codice un controllo che rinomina ulteriormente il file fino a quando non trova un nome "libero".
si potrebbe aggiungere una funzione da chiamare al'interno di move(), prima della effettiva rinominazione, una roba tipo:
Codice: Seleziona tutto
funzione controlla (path) {
fino a quando path esiste:
path = path + suffisso_a_scelta
restituisci il nuovo path
}
la trasformazione del nome la puoi gestire come ti pare
Re: Script complesso per rinominare grandi quantità di file
Inviato: venerdì 7 dicembre 2012, 8:22
da King84
Ciao a tutti,
non sono capace di creare una roba tipo quella scritta nel codice qui sopra, grazie comunque.
Laycastle, grazie, però non funziona a dovere: facendo dei test su una cartella con tanti file fittizi, me ne ha cancellati parecchi che sarebbero dovuti rimanere.
Re: Script complesso per rinominare grandi quantità di file
Inviato: venerdì 7 dicembre 2012, 23:18
da cristian_c
Hai parlato di una 'roba tipo' a quella indicata nello pseudo-codice di crap. Ma qual'è esattamente il codice che hai usato?

Re: Script complesso per rinominare grandi quantità di file
Inviato: domenica 9 dicembre 2012, 23:31
da King84
tipo
Codice: Seleziona tutto
funzione controlla (path) {
fino a quando path esiste:
path = path + suffisso_a_scelta
restituisci il nuovo path
}
ma non sono capace di scrivere codice, l'ho già cancellato il file, non mi ricordo come era fatto dentro esattamente!
Re: Script complesso per rinominare grandi quantità di file
Inviato: lunedì 10 dicembre 2012, 10:45
da cristian_c
Codice: Seleziona tutto
check() {
path=$1
suffix="quello_che_vuoi_tu"
while [ -d "$path" ] ; do
path="$path$suffix"
done
return $path
}
e all'interno di move() inserisci:
Re: Script complesso per rinominare grandi quantità di file
Inviato: lunedì 10 dicembre 2012, 14:58
da crap0101
cristian_c ha scritto:
Codice: Seleziona tutto
check() {
path=$1
suffix="quello_che_vuoi_tu"
while [ -d "$path" ] ; do
path="$path$suffix"
done
return $path
}
in bash l'unica cosa che si "returna" è lo stato d'uscita.
Re: Script complesso per rinominare grandi quantità di file
Inviato: lunedì 10 dicembre 2012, 16:34
da cristian_c
Re: Script complesso per rinominare grandi quantità di file
Inviato: lunedì 10 dicembre 2012, 16:58
da crap0101
e quindi?
ripeto... cercando di essere *cristallino*: in BASH una funzione può ritornare solo lo
stato d'uscita, che è un numero compreso tra 0 e 255, NON una stringa, un path, un array, un socket o che altro.
Tra l'altro il link che hai postato dice esattamente questo, forse non ho capito che intedi.
Re: Script complesso per rinominare grandi quantità di file
Inviato: lunedì 10 dicembre 2012, 19:15
da cristian_c
e quindi?
ripeto... cercando di essere *cristallino*: in BASH una funzione può ritornare solo lo stato d'uscita, che è un numero compreso tra 0 e 255, NON una stringa, un path, un array, un socket o che altro.
Tra l'altro il link che hai postato dice esattamente questo, forse non ho capito che intedi.
Ho appurato che effettivamente le funzioni in bash consentono di restituire soltanto numeri interi, ma forse c'è un modo per aggirare il problema:
http://stackoverflow.com/questions/3236 ... h-function 
Re: Script complesso per rinominare grandi quantità di file
Inviato: lunedì 10 dicembre 2012, 22:02
da crap0101
non è che sia un problema, in questo caso: come con le altre funzioni/comandi si pipa su stdout anzichè usare return. I metodi descritti nel link vanno invece bene se si vuole modificare una o più variabili "sul posto".
Re: Script complesso per rinominare grandi quantità di file
Inviato: giovedì 21 febbraio 2013, 17:56
da King84
sono ormai passati otto mesi da quando ho scritto questo thread, ancora non ho trovato una soluzione e ci sto lavorando quasi ogni giorno.
crap001 e cristian_c, grazie, ma sono due mesi che sto rileggendo i vostri ultmi commenti e facendo prove su prove su prove----non ho capito niente ne' di bash ne' di stack overflow :-0
qualcuno sa come risolvere questo problema?!?
Re: Script complesso per rinominare grandi quantità di file
Inviato: venerdì 22 febbraio 2013, 12:04
da UbuNuovo
Ciao, ho da fare, ma
dopo otto mesi meriti di essere considerato:
prova a inserire questo blocco
Codice: Seleziona tutto
suff='D_'
elenco_file="$(ls ${path}/)" # ho usato ls per chiarire
for f in $elenco_file;do
if [[ "$nwfile" == "$f" ]]
then
nwfile=${suff}$nwfile
break
fi
done
subito prima di
Ho fatto su una sola prova su tre file, quindi usa l'echo sul comando mv o provalo su una copia dei files originali.
Poi vedrai che gli altri ottimizzeranno il codice.
Re: Script complesso per rinominare grandi quantità di file
Inviato: venerdì 22 febbraio 2013, 12:22
da cristian_c
È scomparso un pezzo di thread, dove è andato a finire?

Re: Script complesso per rinominare grandi quantità di file
Inviato: venerdì 22 febbraio 2013, 20:45
da UbuNuovo
Mi sono messo a riguardare lo script ma non va bene per certi nomi di file, allora ho pensato di rifare il controllo ad ogni trasformazione di nwfile.
Ho messo nella funzione il codice di controllo ma non funziona bene nel primo ciclo for di eliminazione, ... come fare?
Trovato! Levo il break!
creo la struttura di prova
Codice: Seleziona tutto
#mkdir "img"
#touch "img/abc 123.jpeg" "img/abc_123.jpg" "img/abc_123@.jpg" "img/abc-123@.jpg"
questo è lo script che eseguo con "./rinomina.sh img".
Ora dovrebbe andare ho dovuto levare "break"
Codice: Seleziona tutto
#!/bin/bash
# qua i simboli da eliminare
elimina=( "@" ";" ":" )
suff='D_'
controlla_esistenza(){
elenco_file="$(ls ${path}/)" # ho usato ls per chiarire
for f in $elenco_file;do
if [[ "$nwfile" == "$f" ]]
then
nwfile=${suff}$nwfile
#break
fi
done
}
move() {
while read file ; do
nwfile=${file##*/}
path=${file%/*}
for i in ${elimina[@]}; do
nwfile="${nwfile//$i/}"
controlla_esistenza #questo non fungeva bene
done
# Inserisci qua le tue sostituzioni:
nwfile="${nwfile// /_}"
controlla_esistenza
nwfile="${nwfile//-/_}"
controlla_esistenza
nwfile="${nwfile//.jpeg/.jpg}"
controlla_esistenza
mv -v "$file" "${path}/${nwfile}"
done
}
find $1 -type d -print | move
find $1 -type f -print | move
Immagino si possa fare di meglio! Qualcuno ne ha voglia?
Re: Script complesso per rinominare grandi quantità di file
Inviato: domenica 24 febbraio 2013, 10:14
da UbuNuovo
Ops avevo postato il codice con i controlli non necessari e messo un prefisso quando si voleva un suffisso.
Ho messo anche la conversione dei file in minuscolo non sopporto il maiuscolo soprattutto vedere '.JPG'.
Il codice funziona, ma se metto 'echo' davanti a 'mv' non mi dice il vero. bo?
Codice: Seleziona tutto
#!/bin/bash
### blocco per creare la struttura di prova ###
#rm -rf "$1"
#mkdir "$1"
#touch "$1/abc 123.jpeg" "$1/abc_123.jpg" "$1/abc_123@.jpg" "$1/abc-123@.jpg" "$1/abc-123@.JPG"
#exit
### fine blocco per creare la struttura di prova ###
reset
# qua i simboli da eliminare
elimina=( "@" ";" ":" )
suff='.D'
controlla_esistenza(){
elenco_file="$(ls ${path}/)" # ho usato ls per chiarire
for f in $elenco_file;do
if [[ "$nwfile" == "$f" ]]
then
nwfile=${nwfile}$suff
fi
done
}
move() {
while read file ; do
nwfile=${file##*/}
path=${file%/*}
for i in ${elimina[@]}; do
nwfile="${nwfile//$i/}"
done
# Inserisci qua le tue sostituzioni:
nwfile=$(echo "$nwfile" | tr [:upper:] [:lower:] )
nwfile="${nwfile// /_}"
nwfile="${nwfile//-/_}"
nwfile="${nwfile//.jpeg/.jpg}"
controlla_esistenza
mv -v "$file" "${path}/${nwfile}" 2>/dev/null
done
}
find $1 -type d -print | move
find $1 -type f -print | move
ottengo
Codice: Seleziona tutto
"img/abc_123@.jpg" -> "img/abc_123.jpg.D"
"img/abc 123.jpeg" -> "img/abc_123.jpg.D.D"
"img/abc-123@.jpg" -> "img/abc_123.jpg.D.D.D"
"img/abc-123@.JPG" -> "img/abc_123.jpg.D.D.D.D"
"img/abc_123.jpg" -> "img/abc_123.jpg.D.D.D.D.D"
Che va bene.
Aggiungendo l'echo:
Codice: Seleziona tutto
...
echo mv -v "$file" "${path}/${nwfile}" 2>/dev/null
...
ottengo
Codice: Seleziona tutto
mv -v img img/img
mv -v img/abc_123@.jpg img/abc_123.jpg.D
mv -v img/abc 123.jpeg img/abc_123.jpg.D
mv -v img/abc-123@.jpg img/abc_123.jpg.D
mv -v img/abc-123@.JPG img/abc_123.jpg.D
mv -v img/abc_123.jpg img/abc_123.jpg.D
che non è il vero comportamento, rimarrebbe un solo file. Perché?
Re: Script complesso per rinominare grandi quantità di file
Inviato: sabato 2 marzo 2013, 10:44
da UbuNuovo
Oggi ho un po di tempo. Qualcuno saprebbe spiegarmi quanto detto nel post precedente? Cioè, il perché del comportamento di
Codice: Seleziona tutto
...
echo mv -v "$file" "${path}/${nwfile}" 2>/dev/null
...
Grazie