Newsgroup: it.comp.os.linux.software
Titolo: Sostituzione di spazi

In pratica mi trovo dei file chiamati in questo modo:
henryx@blackshell:~/DownLoad/Sound/Mpx/Gladiator$ ls
01 - Hans Zimmer and Lisa Gerrard - Progeny.mp3
02 - Hans Zimmer and Lisa Gerrard - The Wheat.mp3
03 - Hans Zimmer and Lisa Gerrard - The Battle.mp3
04 - Hans Zimmer and Lisa Gerrard - Earth.mp3
05 - Hans Zimmer and Lisa Gerrard - Sorrow.mp3
06 - Hans Zimmer and Lisa Gerrard - To Zucchabar.mp3
07 - Hans Zimmer and Lisa Gerrard - Patricide.mp3
08 - Hans Zimmer and Lisa Gerrard - The Emperor Is Dead.mp3
09 - Hans Zimmer and Lisa Gerrard - The Might of Rome.mp3
10 - Hans Zimmer and Lisa Gerrard - Strength and Honor.mp3
11 - Hans Zimmer and Lisa Gerrard - Reunion.mp3
12 - Hans Zimmer and Lisa Gerrard - Slaves to Rome.mp3
13 - Hans Zimmer and Lisa Gerrard - Barbarian Horde.mp3
14 - Hans Zimmer and Lisa Gerrard - Am I not merciful.mp3
15 - Hans Zimmer and Lisa Gerrard - Elysium.mp3
16 - Hans Zimmer and Lisa Gerrard - Honor Him.mp3
17 - Hans Zimmer and Lisa Gerrard - Now we are free.mp3
henryx@blackshell:~/DownLoad/Sound/Mpx/Gladiator$ 
Ora, dato che usando uno script convertitore mp3 -> ogg mi fa l' errore
di prendere ogni argomento del file come un argomento a se stante (in
pratica mi vede 01, -, e Hans come argomenti separati), come faccio a
convertire quegli spazi in underscore? Usando sed mi da il risultato
sperato, convertendo gli spazi in underscore (piu` digeribili per la
bash), ma come faccio per rinominare questi file? In altrenativa, come
faccio a far capire che, ad esempio, il file 
01 - Hans Zimmer and Lisa Gerrard - Progeny.mp3
e` da prendere come unico argomento?
Henryx
P.S. I nomi dei file li apsso allo script in questo modo: for i in `ls`;
P.P.S. E` divertente usare il sed ;)
-- 
===UN*X is SEXY!===
who|grep -i "green eyes"|date; cd ~; apropos fsck; whatis `unzip`|touch; 
strip; finger; mount; gasp; yes|more; uptime; umount; sleep

 P.P.S. E` divertente usare il sed ;)
Gia' <g>
-- 
Pierluigi De Rosa (
tho...@durin.khazad-dum.net
).
<<      LINUX: the choice of a GNU generation     >>
<<   For my real address... ask the Balrog.       >>
* Sostenete la Lega per la Soppressione dei Troll *


 
| $ for i in *.mp3; do mv "$i" `echo "$i" | sed 's/ /_/g'`; done
Mh? Ma non avevi detto che non funzionava (l'ho letto quel thread)?
inoltre, perche` passando direttamente l'output di ls non va?
Henryx


 inoltre, perche` passando direttamente l'output di ls non va?
[root@durin GNACCA]# ls
Bollicine.bmp     Cuciture.bmp          Pied-de-poule.bmp
Bosco.bmp         Installazione.bmp     Piramidi.bmp
Canneto.bmp       Maglia metallica.bmp  Tratteggio di ombre.bmp
Cerchi.bmp        Maiolica.bmp          aerial-view-l.bmp
Chiodini blu.bmp  Mille righe.bmp       blackwav.bmp
Cornicetta.bmp    Nuvole.bmp            bukit.bmp
Cubi rossi.bmp    Onde.bmp              candi-bentar-l.bmp
[root@durin GNACCA]# for i in *; do mv "$i" `echo "$i" | sed 's/ /_/g'`; done
mv: `Bollicine.bmp' and `Bollicine.bmp' are the same file
mv: `Bosco.bmp' and `Bosco.bmp' are the same file
mv: `Canneto.bmp' and `Canneto.bmp' are the same file
mv: `Cerchi.bmp' and `Cerchi.bmp' are the same file
mv: `Cornicetta.bmp' and `Cornicetta.bmp' are the same file
mv: `Cuciture.bmp' and `Cuciture.bmp' are the same file
mv: `Installazione.bmp' and `Installazione.bmp' are the same file
mv: `Maiolica.bmp' and `Maiolica.bmp' are the same file
mv: `Nuvole.bmp' and `Nuvole.bmp' are the same file
mv: `Onde.bmp' and `Onde.bmp' are the same file
mv: `Pied-de-poule.bmp' and `Pied-de-poule.bmp' are the same file
mv: `Piramidi.bmp' and `Piramidi.bmp' are the same file
mv: `aerial-view-l.bmp' and `aerial-view-l.bmp' are the same file
mv: `blackwav.bmp' and `blackwav.bmp' are the same file
mv: `bukit.bmp' and `bukit.bmp' are the same file
mv: `candi-bentar-l.bmp' and `candi-bentar-l.bmp' are the same file
[root@durin GNACCA]# ls
Bollicine.bmp     Cuciture.bmp          Pied-de-poule.bmp
Bosco.bmp         Installazione.bmp     Piramidi.bmp
Canneto.bmp       Maglia_metallica.bmp  Tratteggio_di_ombre.bmp
Cerchi.bmp        Maiolica.bmp          aerial-view-l.bmp
Chiodini_blu.bmp  Mille_righe.bmp       blackwav.bmp
Cornicetta.bmp    Nuvole.bmp            bukit.bmp
Cubi_rossi.bmp    Onde.bmp              candi-bentar-l.bmp



[...]
| [root@durin GNACCA]# for i in *; do mv "$i" `echo "$i" | sed 's/ /_/g'`; done
[...]
Ok, ora mi hai convinto :)
A questo punto mi resta un solo quesito: perche` passando al ciclo for
direttamente l'output di ls non funzia, mentre indicandogli i file con
*.mp3 funzia piu` che bene?
Henryx
P.S. carina quella robba, un po' masochistica ma carina :)))


bash), ma come faccio per rinominare questi file? In altrenativa, come
Mi sono abituato ad usare mp3clean. Molto carino.
-- 
        Giuseppe "Cowo" Corbelli  -->>  Riding on Linux-2.2.18
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
DOS - Defective Operating System
IBM - I Blame Microsoft
BASIC - Bill's Attempt to Seize Industry Control
WINDOWS - Will Install Needless Data On Whole System
MICROSOFT - Most Intelligent Customers Realize Our Software Only Fools Teenagers

 P.S. carina quella robba, un po' masochistica ma carina :)))
sed apre infiniti universi, effettivamente :-P


 convertire quegli spazi in underscore? Usando sed mi da il risultato
Ti consiglio vivamente "rename".  Magari potresti utilizzare la riga di
comando:
rename 's/ /\xa0/g' "* *"
oppure, per passare tutto un albero di directory,
find -name '* *' | rename 's/ /\xa0/g'
Cosa fa?  converte tutti gli spazi in spazi non secanti, per capirci il
&nbsp; dell'HTML, il ~ di LaTeX o il ° di M$ Word se l'hai usato.
Poi non avrai più problemi di questo tipo con nessuno script.
PS: occhio che se non hai impostato correttamente il locale, la tua shell
visualizzerà lo spazio non secante con un ? e non con uno spazio!

 rename 's/ /\xa0/g' "* *"
Perche' complicarsi la vita quando sed fa questo e _MOLTO_ altro? Oh,
poi de gustibus, ovviamente...


 bash), ma come faccio per rinominare questi file?
Ho scritto un programmino per un amico in C per dos/djgpp (ma portabile in
linux cambiando un paio di cosette), che fa questo e molto di piu':
- togliere una stringa dai nomi di tutti i file di una dir
- sostituire una stringa con un'altra
- cambia in maiuscolo le lettere dopo gli spazi, in minuscolo quelle dopo
gli apostrofi e tutte le altre
- scambia le due parti del nome del file, parti divise da un carattere
specificato (nel tuo caso, il trattino '-')
Se vuoi te lo mando, pero' il porting te lo fai da te ;-)
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscalinet.it


| Uh?
[...]
| [root@durin BOH]# for i in *; do mv "$i" `ls "$i" | sed 's/ /_/g'`; done
Ehm, intendo un ciclo come questo:
for i in `ls`; do mv "$i" `sed 's/ /_/g'`; done
| > P.S. carina quella robba, un po' masochistica ma carina :)))
| sed apre infiniti universi, effettivamente :-P
Intendevo quella che si trovava nella dir :))
Henryx


 - togliere una stringa dai nomi di tutti i file di una dir
Quanto tempo perso quando c'era gia' sed..


 for i in `ls`; do mv "$i" `sed 's/ /_/g'`; done
Non puo' funzionare: ls mostra non solo il nome del file, pensaci un
attimo.. ci sono altri campi come la dimensione, time stamp, i
permessi..



 
| > Ehm, intendo un ciclo come questo:
| > for i in `ls`; do mv "$i" `sed 's/ /_/g'`; done
| Non puo' funzionare: ls mostra non solo il nome del file, pensaci un
| attimo.. ci sono altri campi come la dimensione, time stamp, i
| permessi..
ehm, thorin, e` un ls , non un ls -l
Cmq, sarebbe piu` coretto un ls -1 (mmm... quasi quasi provo cosi`...
no, non funzia)


no, non funzia)
Il listato di ls, che sia o no con -1, non riesci ad evitare che venga
visto da $i come 2 o 3 file anziche' uno con spazi, penso.
La riga di Thorin va d'incanto, al piu` puoi sostituire ls con echo se
hai dubbi per la storia di ls -1.
Guarda: (ls -l)
total 1
-rw-r--r--    1 rr       rr              0 Apr 28 02:21 c1 1
-rw-r--r--    1 rr       rr              0 Apr 28 02:21 c1 2
-rw-r--r--    1 rr       rr              0 Apr 28 02:22 c1 3
-rw-r--r--    1 rr       rr             68 Apr 28 02:15 p.spazi
(cat p.spazi)
#!/bin/bash
for i in *; do mv "$i" `echo "$i" | sed "s/ /_/"`; done
(. p.spazi; ls -l)
/bin/mv: `p.spazi' and `p.spazi' are the same file
total 1
-rw-r--r--    1 rr       rr              0 Apr 28 02:31 c1_1
-rw-r--r--    1 rr       rr              0 Apr 28 02:31 c1_2
-rw-r--r--    1 rr       rr              0 Apr 28 02:31 c1_3
-rw-r--r--    1 rr       rr             68 Apr 28 02:15 p.spazi
-- 
Ci sentiamo  |  Remigio Zedda  || Attenzione! campo "From:" alterato
ciao Remigio |                 ||==> E-mail: 
remi...@tiscalinet.it
-------------|      ..si` d'accordo.. ma con la Deb e` un'altra cosa!
/* Linux 2.2.17 su Debian GNU/Linux 2.2 Potato */

 no, non funzia)
No, non funzia comunque, come hai potuto notare.. tanto vale fare
come dicevo io, che funziona sicuramente.


 Quanto tempo perso quando c'era gia' sed..
Sai com'e', l'amico per cui l'ho scritto usa win98...


 Sai com'e', l'amico per cui l'ho scritto usa win98...
Sai com'e', esiste sed anche per Uindous.. se vi informaste, magari..


 Sai com'e', esiste sed anche per Uindous.. se vi informaste, magari..
Questo non lo sapevo... eppoi mi sono divertito a farlo ;-)


 Questo non lo sapevo... eppoi mi sono divertito a farlo ;-)
De gustibus: se ti piace perder tempo... ;-)



 
| E cosi'? 
| for i in "`ls`"; do $TUFF; done
Funziona!!!


for i in "`ls`"; do $TUFF; done
Puoi dirmi cosa diavolo e` TUFF?
Cmq da me non funge, se quello che deve fare e`: pippo 1 --> pippo_1



 
| Puoi dirmi cosa diavolo e` TUFF?
Mmm... una variabile fittizzia? ;)
| Cmq da me non funge, se quello che deve fare e`: pippo 1 --> pippo_1
Ho provato or ora ed ha funzionato ^^


Mmm... una variabile fittizzia? ;)
E buona notte, ne so quanto prima:-((
Eppure ce n'e` un'altra simile (per tagliare le estensioni?) che non
rieso a ricordare e ritrovare..



 
| >|Puoi dirmi cosa diavolo e` TUFF?
| >Mmm... una variabile fittizzia? ;)
| E buona notte, ne so quanto prima:-((
Fittizzia nel senso che se l'e` inventata sul momento
| Eppure ce n'e` un'altra simile (per tagliare le estensioni?) che non
| rieso a ricordare e ritrovare..
Mmm... $STUFF ? Non mi chiedere pero` a cosa serve (in effetti non so
nemmeno se e` a questa che ti riferivi ^^; )
Henryx
P.S. ho cambiato il topic


P.S. ho cambiato il topic
Che spiritoso, non c'ho minga Autlukkkkkk sai ;-)))


 Puoi dirmi cosa diavolo e` TUFF?
E' una simpatica variabile d'ambiente che dopo un 
$ export TUFF="mv "$i" `echo "$i" | tr " " "_"`" 
(con bash), diventera' un po' piu' utile. :-)
Era solo per riassumere quello che voleva fare, do stuff. :-)


$ export TUFF="mv "$i" `echo "$i" | tr " " "_"`" 
Va be', preferisci tr a sed e passi per una variabile. Per il resto e`
identica come riga di comando. Invece puo` essere piu` sicuro inviare
l'output di ls, come fai tu, anziche' far leggere i file direttamente
da bash: si dovrebbe poter stare fuori della directory destinazione.
Hai motivo per non usare sed?


 Hai motivo per non usare sed?
tr e' piu' piccolo.



 
| Certo. Henryx voleva usare ls, il punto sono le virgolette intorno a
| `ls`.
Cmq, tra l'altro, riprovandolo mi fa' un brutto scherzo. Eccoti un
esempio:
henryx@blackshell:~$ cd Mail/draft/
henryx@blackshell:~/Mail/draft$ ls
1  2  3  4  5
henryx@blackshell:~/Mail/draft$ for i in "`ls`";do echo $i; done
1 2 3 4 5
henryx@blackshell:~/Mail/draft$ for i in *;do echo $i; done
1
2
3
4
5
henryx@blackshell:~/Mail/draft$
In pratica, mettendo "`ls`" tratta l'output di ls come un unico
argomento (nota la posizione e gli spazi dopo l'elaborazione); mentre,
mettendo *, l'output di ls viene elaborato in modo corretto, ovvero ogni
elemento viene trattato come parte a se stante


henryx@blackshell:~/Mail/draft$ for i in "`ls`";do echo $i; done
echo "$i"



 
| >henryx@blackshell:~/Mail/draft$ for i in "`ls`";do echo $i; done
| echo "$i"
Ehm, si, errore mio ^^;;;
