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
King84 » [url=http://forum.ubuntu-it.org/viewtopic.php?p=4263920#p4263920]oggi, 8:22[/url] ha scritto: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.
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
King84 » [url=http://forum.ubuntu-it.org/viewtopic.php?p=4266296#p4266296]ieri, 23:31[/url] ha scritto: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!

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:

Codice: Seleziona tutto

check path

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
crap0101 » [url=http://forum.ubuntu-it.org/viewtopic.php?p=4266760#p4266760]oggi, 14:58[/url] ha scritto:
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.
http://www.pluto.it/files/ildp/guide/ab ... MPLEXFUNCT ;)

Re: Script complesso per rinominare grandi quantità di file

Inviato: lunedì 10 dicembre 2012, 16:58
da crap0101
cristian_c ha scritto:
crap0101 » [url=http://forum.ubuntu-it.org/viewtopic.php?p=4266760#p4266760]oggi, 14:58[/url] ha scritto:
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.
http://www.pluto.it/files/ildp/guide/ab ... MPLEXFUNCT ;)
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

Codice: Seleziona tutto

mv -v "$file" "${path}/${nwfile}" 2>/dev/null
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? :o

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