Newsgroup: it.comp.os.linux.iniziare
Titolo: copiare con rinomina automatica

Oggi misento schematico...  :-D
Stato di fatto:
Ho un albero di direcotries e subdir e sottosubdir ecc...
contenti diversi tipi di file tra cui immagini in formati
differenti: jpg, tif, gif, JPG e mi pare basta cos�.
Obiettivo:
Voglio copiare tutte quelle immagini in un unica directory
contenete solo quelle immagini senza gli altri files presenti
nell'albero di cui sopra.
Problema:
Alcuni files presenti in differenti sottodir hanno lo stesso
nome, ad esempio il file 1.JPG pu� essere presente sia in
dirtree/subdirpippo
che in
dirtree/subdirpaperino
Si tratta di due immagini potenzialmente differenti.
A me serve averle entrambe nella dir di destinazione.
Note:
Mi pare ovvio che i file ominimi vadano rinominati visto che
vengono messi nella stessa diretory.
Ho provato gi� con:
find dirtree -iname "*.jpg" -exec cp "{}" destdir \;
che di fatto sposta tutti file dell'alero terminanti in jpg o JPG
nella dir di destinazione. Ma ha questo bug degli omonimi:
di due o pi� files con lo stesso nome, nella destinazione resta
solo l'ultimo copiato in quanto gli eventuali precedenti vengono
sovrascritti.
D'altra parte l'opzione -i di cp non m'aiuta pi� di tanto perchmi
avverte semplicemente, troppo interattivo e poco funzionale (cio�
come faccio poi a cambiare nome al file da copiato dal prompt di
cp... non mi risulta possibile, o s�?).
La soluzione che avrei in testa io sarebbe quella di trovare un
modo per rinominare automaticamente il file copiato, tipo
aggiungendo un numero prima del nome: pippo.jpg --> 1pippo.jpg,
nel caso pippo.jpg esista gi�.
Prima per� di provare con qualche script ho ricercato un po' via
google, ma senza un riscontro che contemplasse questa
possibilit�.
Areste qualche dritta?

 ...
Mancano solo alcuni dettagli
find $origine -type f \( -name '*.jpg' -o -name '*.gif' -o ... \) \ 
-exec cp  --force --backup=numbered  -t $destinazione {} +
L'opzione --force è necessaria.
Potrebbe non piacerti il suffisso del backup ma puoi aggiustarlo 
in un secondo tempo.

 in un secondo tempo.
Questo potrebbe essere un problema, in quanto quei file dovranno
essere accessibili anche ad altri che magari usano sistemi pi�
rigidi in materia di estensioni.
Infatti ora mi ritrovo con:
pippo.jpg
pippo.jpg~1~
pippo.jpg~2~
ecc...
non vorrei che quella roba in fondo al nome del file mettesse in
crisi qualche programma di gestioni immagini, lo ipotizzo da
ignorante in materia; 'somma. non si sa mai:
vorrei mantenere l'estensione jpg o quel che �.
Prima di leggere la tua risposta ho buttato gi� mezzo script:
----------
SRCFILE=$1
DESTDIR=$2
DESTFILE=$SRCFILE
i=1
while [ -e $DESTDIR/$SRCFILE ]; do
  DESTFILE=${i}_${SRCFILE}
  i=$[$i+1]
done
cp $SRCFILE $DESTDIR/$DESTFILE
------------------------------
Ovviamente non testato  ;-)
L'intento era quello di ottenere delle rinomine del tipo:
1_pippo.jpg
2_pippo.jpg
in modo da lasciare la "desinenza" inalterata.
Sarebbe stato da usare con find, dandolo in pasto ad "-exec"
Che dici, potrebbe risolvere il problema?
Oppure a questo punto come intervenire sui files con l'estensione
sballata?
Evidentemente li trovo con:
find $destinazione -name "*.~?~"
Tu come modificheresti i nomi?

 Ovviamente non testato  ;-)
Ovviamente perché una cosa simile non potrebbe mai funzionare.
for i in *.jpg-*- ; do mv "${i/.jpg/}.jpg" 
non funziona se il file ha ritorni a capo nel nome o per file del tipo:
"Il formato .jpg e' molto bello.jpg" 

 "Il formato .jpg e' molto bello.jpg"
Ovviamente  :-|

 Dov'è che si parla della questione dei dashes #1 #2 ecc ecc?
man mmv
http://linux.die.net/man/

 Intendo proprio mmv.
Dar�, un'occhiata grazie di tutto

 "Il formato .jpg e' molto bello.jpg" 
Capisco.
Pragmaticamente parlando questo funziona:
$ for i in *.~?~; do mv \
  ${i} $(echo ${i}|sed 's/\(....\)\.~\(.\)~$/-\2\1/'); done
$ ls
11-1.jpg        img_0796-1.jpg       scansione0002-1.jpg
scansione0005-1.jpg  scansione0007-2.jpg  scansione0009-1.jpg
15-1.jpg        scansione0001-1.jpg  scansione0002-2.jpg
scansione0006-1.jpg  scansione0008-1.jpg  scansione0010-1.jpg
img_0021-1.jpg  scansione0001-2.jpg  scansione0004-1.jpg
scansione0007-1.jpg  scansione0008-2.jpg  scansione0011-1.jpg
per esempio la prima si chiamava:
11.jpg.~1~
adesso come si vede sopra:
11-1.jpg
Probabilmente � pi� maneggevole per alcuni software/sistemi.
Questa dovrebbe funzionare anche con file del tipo
dell'esempietto: "Il formato .jpg e' molto bello.jpg".
Per files con ritorni a capo nel nome probabilmente restano
problemi, ma fortunatamente non � il mio caso.
Pareri?

 dell'esempietto: "Il formato .jpg e' molto bello.jpg".
No. Devi aggiungere le virgolette

  done
vero, pi� giusto e coerente con la modalit� di rinomina che
applica "cp --backup=numbered".
Visto quanto aggiungi anche sotto, forse le virgolette � maglio
metterle anche nel file da copiare:
mv "${i}" "$(echo $i.... "
Noto che tu non hai "escapato" le parentesi tonde. Forse perch�
hai fatto unoscriptino e non hai lavorato da linea di
comando...non so. O forse quelle doppie virgolette risolvono il
problema, non ho provato sinceramente.
Ecco, mettendo le virgolette in quel modo, lo script
contemplerebbe anche i file contentei "newline" nel nome?
Ed eventualmente come si potrebbe risolvere la cosa stando su
soluzioni standard, magari partendo dallo scriptino sopra?
Grazie ancora della chiacchierata!  :-D

 soluzioni standard, magari partendo dallo scriptino sopra?
In giro si trovano decine di script che rinominano i file

 Noto che tu non hai "escapato" le parentesi tonde. 
Dimenticavo:
Per qull'escapato verrai torturato con la tortura del dentifricio al 
pepe di cayenna.
Inoltre usare le virgolette non esonera dall'usare le parole corrette.

 Inoltre usare le virgolette non esonera dall'usare le parole corrette.
Per� rimarca, che la parola utilizzata non � compresa nel
vocabolario e chi l'ha usata ne � consapevole, e ne ha fatto uso
perch� il messaggio arriva comunque bene.
Nel caso specifico non mi veniva in mente la parola corretta, e
francamente neanche ora mi viene in mente, dovrei ricorrere ad
una perifrasi del tipo "proteggere le parentesi tonde con
la barra retroversa..."      mmmm...suonds good? 
Saluti e grazie delle precisazioni

 A me serve averle entrambe nella dir di destinazione.
per assurdo potresti anche usare il percorso come nome univoco del file
tipo:
$ find /home/user1 -iname "*jpg" | while read name; do 
newname="${name//\//_}"; cp "$name" "$newname"; done