Newsgroup: it.comp.os.linux.iniziare
Titolo: bash script/comando: rinominare tutto in maiuscolo

Ho una directory contente un certo albero di subdir e files.
Vorrei rinominare tutti i files e le dir in maiuscolo.
Partiamo dall'esempio "disney-iano"
---------
# ls -lR1
.:
total 0
drwxr-xr-x 2 root root  0 May 31 19:40 paperopoli
-rw-r--r-- 1 root root 16 May 31 10:50 pippo
./paperopoli:
total 0
-rw-r--r-- 1 root root 0 May 31 19:39 3bassotti-band
-rw-r--r-- 1 root root 0 May 31 19:39 PAper$ne
-rw-r--r-- 1 root root 0 May 31 19:09 paprino
-rw-r--r-- 1 root root 0 May 31 19:10 qui quo qua
-------------------------------------------------
Ok, quindi abbiamo una dir, quella corrente, che contiene il file
"pippo" e la subdir "paperopoli".
La subdir paperopoli a sua volta contiene il file "paperino", il
file "qui quo qua", il file "PAper$one" e il file "3bassotti-band".
Scopo del gioco ? arrivare a:
---------
# ls -lR1
.:
total 0
drwxr-xr-x 2 root root  0 May 31 19:40 PAPEROPOLI
-rw-r--r-- 1 root root 16 May 31 10:50 PIPPO
./PAPEROPOLI:
total 0
-rw-r--r-- 1 root root 0 May 31 19:39 3BASSOTTI-BAND
-rw-r--r-- 1 root root 0 May 31 19:39 PAPER$NE
-rw-r--r-- 1 root root 0 May 31 19:09 PAPRINO
-rw-r--r-- 1 root root 0 May 31 19:10 QUI QUO QUA
--------------------------------------------------
Ho provato questo:
find -print | while read f; \
          do n="`echo $f | tr '[:lower:]' '[:upper:]'`"; \
          [ "$f" != "$n" ] && mv "$f" "$n"; done
Ma mi da qualche problema, perch? rinominando la subdirectory poi non
trova pi? i file dentro. Facendolo girare due volte poi va a buon fine.
Ho visto anche altre soluzioni tipo con rename, ma non sono riuscito a
farle funzionare.
-------------------------------
# find -print | while read f; \
do n="`echo $f | tr '[:lower:]' '[:upper:]'`"; \
[ "$f" != "$n" ] && mv "$f" "$n"; done
mv: cannot stat `./paperopoli/paprino': No such file or directory
mv: cannot stat `./paperopoli/qui quo qua': No such file or directory
mv: cannot stat `./paperopoli/3bassotti-band': No such file or directory
mv: cannot stat `./paperopoli/PAper$ne': No such file or directory
# find -print | while read f; \
do n="`echo $f | tr '[:lower:]' '[:upper:]'`"; \
[ "$f" != "$n" ] && mv "$f" "$n"; done
# ls -lR1
.:
total 0
drwxr-xr-x 2 root root  0 May 31 19:48 PAPEROPOLI
-rw-r--r-- 1 root root 16 May 31 10:50 PIPPO
./PAPEROPOLI:
total 0
-rw-r--r-- 1 root root 0 May 31 19:39 3BASSOTTI-BAND
-rw-r--r-- 1 root root 0 May 31 19:39 PAPER$NE
-rw-r--r-- 1 root root 0 May 31 19:09 PAPRINO
-rw-r--r-- 1 root root 0 May 31 19:10 QUI QUO QUA
--------------------------------------------------
Se avete qualche idea, osservazione e miglioramento dite pure.

 Se avete qualche idea, osservazione e miglioramento dite pure.
hai descritto il problema perfettamente, ora se lo studi
con calma ti renderai conto che il problema sta nel voler
usare un solo comando.

 usare un solo comando.
Quindi tu dici di separare le directories dai files, cioe':
1) portare in upper case tutte le directories (find -type d)
2) portare in upper case tutti i files  (find -type f)
pero'... non mi torna.
Intendevi questo?

 Se avete qualche idea, osservazione e miglioramento dite pure.
per ovviare al problema ti potresti dire  a find di partire ad elencarti 
i nomi dei file partendo dalle foglie ed andandoa ritroso (opzione -depth)
devi fare un po' di magheggi per fare dei confronti e degli mv 
consistenti.
io ho modificato così e sembra andare, nn ho verificato su alberi atre 
livelli, ma credo possa andare , questo magari dimmelo tu.
find  -depth| while read f; \
          do n="`basename $f | tr '[:lower:]' '[:upper:]'`"; \
          n1=`basename $f`
          DIR=`dirname $f`
          [ "$n1" != "$n" ] && mv "$f" "./$DIR/$n"; done

 trova pi? i file dentro.   ...
Una /race/ /condition/. La soluzione è dept:
find . -depth -print0 |  
while IFS='' read -r -d '' f 
 do 
    ...


si
oppure
find -depth ....

 
Io proverei ad adattare questo esempio:
http://tinyurl.com/37avdj5

           [ "$n1" != "$n" ] && mv "$f" "./$DIR/$n"; done
Ok, l'idea mi piace, abche se ho riscontrato qualche
problema coi nomi contenti spazi, ma penso sia banalmente
una svista, ho corretto:
n="`basename "$f"   ..ecc...
n1=`basename= "$f"`
Però il tutto alla fine è stato scritto in uno script, se
non altro per memorizzare il tutto.
Ho fatto qualche test con directories e subdir a
multilivello e pare girare bene. Forse ho esagerato con le
virgolette ""... eventualmente vogliate correggere fate
pure.
Di seguito, lo script ed il test.
Ne è poi uscita una versione lower.sh che fà la cosa
contraria... utile per riportare tutto in lower case per
ritestare lo script upper.sh.
-----------------
# cat ../upper.sh
find  -depth| while read "f"
do
  n="`basename "$f" | tr '[:lower:]' '[:upper:]'`"
  n1="`basename "$f"`"
  DIR="`dirname "$f"`"
  [ "$n1" != "$n" ] && mv "$f" "./$DIR/$n"
done
----
root@slax:~/topolinia# find
.
./paperopoli
./paperopoli/3bassotti-band
./paperopoli/paper$one
./paperopoli/paperino
./paperopoli/qui quo qua
./pippo
./deepdir
./deepdir/lev1
./deepdir/lev1/lev2
./deepdir/lev1/lev2/file2
./deepdir/lev1/lev2/lev 3
./deepdir/lev1/lev2/lev 3/fondo
./deepdir/lev1/file1
root@slax:~/topolinia# ../upper.sh
root@slax:~/topolinia# find
.
./PAPEROPOLI
./PAPEROPOLI/3BASSOTTI-BAND
./PAPEROPOLI/PAPER$ONE
./PAPEROPOLI/PAPERINO
./PAPEROPOLI/QUI QUO QUA
./PIPPO
./DEEPDIR
./DEEPDIR/LEV1
./DEEPDIR/LEV1/LEV2
./DEEPDIR/LEV1/LEV2/FILE2
./DEEPDIR/LEV1/LEV2/LEV 3
./DEEPDIR/LEV1/LEV2/LEV 3/FONDO
./DEEPDIR/LEV1/FILE1
--------------------
Cosa vi pare?

 done
Quel test non serve a niente: mv già si rende conto quando è
inutile rinominare un file. piuttosto aggiungerei un test per 
verificare di non sovrascrivere un qualche file. O in alternativa
usare l'opzione --backup. 

 usare l'opzione --backup.
Mmmmm...
Sul discorso mv, non lo sapevo, buono a sapersi.
Per quanto riguarda la potenziale sovrascrittura hai
ragione, bisogna assicurarsi che non esista giŕ un file:
"./$DIR/$n"
Il caso puň presentarsi se per esempio vi fosse file
nominato identicamente trane che per il case:
/pathX/pippo
/pathX/PIPPO
In tal caso il "pippo" minuscolo sovrascriverebbe quello
maiscolo.
Penso intendessi questo, ma se avevi in mente anche altro
ti pregherei di farlo presente.
___________________________________________________
# cat ../upper.sh
ERRLOG=/tmp/upper.log
rm $ERRLOG 2>/dev/null
find  -depth| while read "f"
do
  n="`basename "$f" | tr '[:lower:]' '[:upper:]'`"
  n1="`basename "$f"`"
  DIR="`dirname "$f"`"
  [ ! -e "./$DIR/$n" ] && mv "$f" "./$DIR/$n" \
                         || echo "$f" >> $ERRLOG
done
[ -e $ERRLOG ] && \
cat <<EOF
Some files not been renamed!
Please, look at file:
$ERRLOG
EOF
____________________________________________________
La soluzione sopra, non testata, vorrebbe evitare la
sovrascrittura. Nell'eventualitŕ di una omonimia ma
con case differente, non rinomina il file e registra
il problema in un file di log consultabile a posteriori
dell'utente.
Saluti e grazie per l'intervento! :-)

 # cat ../upper.sh
Questo è il comando con cui mostri il file?
Oove è lo sha-bang?