Script complesso per rinominare grandi quantità di file

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Laycastle
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1183
Iscrizione: sabato 9 aprile 2011, 21:54
Desktop: KDE 4.8
Distribuzione: Gentoo ~amd64
Località: Torino

Re: Script complesso per rinominare grandi quantità di file

Messaggio da Laycastle »

Ciao,
sono stato assente un bel po' dal forum, se ti serve ancora dimmelo che riprendo in mano lo script.
la via più breve tra due punti è l'arabesco.
King84

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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
King84

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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
King84

Re: Script complesso per rinominare grandi quantità di file

Messaggio da King84 »

Ancora un altro mese è passato... nessuna novità riguardo alla creazione di questo script?
Grazie!
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
King84

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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.
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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? :)
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
King84

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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 ;)
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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 :)
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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".
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
King84

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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?!?
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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.
Salva l'Ucraina! 🇺🇦
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: Script complesso per rinominare grandi quantità di file

Messaggio da cristian_c »

È scomparso un pezzo di thread, dove è andato a finire? :o
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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?
Salva l'Ucraina! 🇺🇦
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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é?
Salva l'Ucraina! 🇺🇦
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Script complesso per rinominare grandi quantità di file

Messaggio 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
Salva l'Ucraina! 🇺🇦
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti