Newsgroup: it.comp.os.linux.iniziare
Titolo: rsync con rename

esiste un'utility di backup che permetta di sincronizzare due directory
montate su file system diversi rinominando automaticamente i
file che nel file system destinazione avrebbero un nome illegale?
Ho cercato in rete e trovato unison:
http://www.cis.upenn.edu/~bcpierce/unison/download/releases/beta/unison-manual.html
ma da quanto capisco:
"illegal filenames. Unix allows some filenames that are illegal in
Windows. For example, colons (`:') are not allowed in Windows filenames,
but they are legal in Unix filenames. This means that a Unix file foo:bar
can't be synchronized to a Windows system. As with case conflicts, Unison
detects this situation for you, and you have the same options: you can
either rename the Unix file and re-synchronize, or you can ignore it."
bisogna dargli i nomi a mano, mentre a me basterebbe che cambiasse per
esempio tutti i nomi di quei files contenenti un "?" con lo stesso
nome ma con un "-" al posto del "?".
Trattasi di centinaia di migliaia di files, e quindi non puo' essere una
procedura interattiva.
Grazie per l'attenzione,
t


Secondo me conviene effettuare l'operazione in due passaggi :
1) rendere i nomi dei file legali per entrambi i filesystem
2) sincronizzare le directory
per sostituire un carattere nel nome del file ti passo questo script
adattato per il tuo esempio, cioč - al posto di ?
ha effetto su tutti i files della directory corrente
fai delle prove prima di lavorare su files importanti!!!
dopo di che esegui un rsync
ciao.
#! /bin/bash
#
# Sostituisce un carattere all'interno del nome di un file
outchar='?'     # carattere da sostituire
inchar='-'      # carattere sostitutivo
number=0                                        # numero di files rinominati
for filename in * ; do                          # controlla tutti i files e directories
   echo "$filename" | grep -q "$outchar"        # controllo la presenza di un carattere
   if [ $? -eq "0" ]; then                      # controllo positivo
      fname=$filename
      n=`echo "$fname" | sed -e 's/'"$outchar"'/'"$inchar"'/g'`   # sostituzione
      if [ -e "$n" ]; then
         echo "$fname  non puņ essere rinominato"
      else
         mv "$fname" "$n"                       # rinomina il file
         let "number += 1"
      fi
   fi
done
if [ "$number" -eq "1" ]; then                  # Differenza fra singolare e plurale
   echo "$number file rinominato"
else
   echo "$number files rinominati"
fi
exit 0
-- 
Nel fare una profonda riverenza a qualcuno
si voltano sempre le spalle a qualche altro
                                             - Abate Galiani -

 grazie.
prova questo
#! /bin/bash
#
# Sostituisce un carattere all'interno del nome di un file
outchar='?'     # carattere da sostituire
inchar='-'      # carattere sostitutivo
fnumber=0                                       # numero di files rinominati
dnumber=0                                       # numero di directories rinominate
# controlla prima le directories
dren=1
while  [ "$dren" -eq "1" ]; do
   dren=0
   for filename in `find -type d`; do           # controlla tutte le directories
      echo "$filename" | grep -q "$outchar"     # controllo la presenza di un carattere
      if [ $? -eq "0" ]; then                   # controllo positivo
         fname=$filename
         n=`echo "$fname" | sed -e 's/'"$outchar"'/'"$inchar"'/g'`   # sostituzione
         if [ -e "$n" ]; then
            echo "$fname  non puň essere rinominata"
         else
            mv "$fname" "$n"                    # rinomina la directory
            let "dnumber += 1"
            dren=1
            break
         fi
       fi 
   done
done
# controlla i file
for filename in `find -type f`; do              # controlla tutti i files
   echo "$filename" | grep -q "$outchar"        # controllo la presenza di un carattere
   if [ $? -eq "0" ]; then                      # controllo positivo
      fname=$filename
      n=`echo "$fname" | sed -e 's/'"$outchar"'/'"$inchar"'/g'`   # sostituzione
      if [ -e "$n" ]; then
         echo "$fname  non puň essere rinominato"
      else
         mv "$fname" "$n"                       # rinomina il file
         let "fnumber += 1"
      fi
    fi 
done
# informazioni
if [ "$dnumber" -gt "0" ]; then
   if [ "$dnumber" -eq "1" ]; then                      # Differenza fra singolare e plurale
      echo "$dnumber directory rinominata"
   else
      echo "$dnumber directories rinominate"
   fi
fi
if [ "$fnumber" -gt "0" ]; then
   if [ "$fnumber" -eq "1" ]; then
      echo "$fnumber file rinominato"
   else
      echo "$fnumber files rinominati"
   fi
fi
exit 0
-- 
Gli uomini sono come gli aquiloni,
piů gli si da corda meglio si tengono.
                                             - Alexandre Dumas, figlio -


magnifico!
Grazie,
t.