[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RiminiLUG-General] bash redirezione I/O PIPE e filtri



Salute a tutti,

Il giorno Tue, 03 May 2011 14:35:34 +0200
Ivan tarozzi <ivan@xxxxxxxxxxxx> ha scritto:
 
> Visto che hai iniziato le danze:
> 
> for i in *.c.txt; do echo mv "'$i'" "'$(basename "$i" .c.txt).c'";
> done |bash -x
> 
> Leggermente diversa ma, mi pare, con gli stessi risultati.
> Anch'io mi aspettavo di dover ridefinire IFS, ma ho visto che non è 
> servito, e mi pare che sia settato some spazio. Quindi il ciclo
> for...in cicla correttamente anche sui files con spazi ?!? mi sarei
> aspettato di no!

giusto Ivan!, in effetti scomodare la modifica di IFS può non servire...

Ecco una versione funzionante, forse più leggibile (per
me) dell'esempio di Ivan, ma è la stessa minestra direi.

touch 'foo bar2.c.txt' 'foo bar.c.txt' 'foo_bar.c.txt' 'foo_bar2.c.txt'
for i in *.c.txt; do echo mv \'$i\' \'$(basename "$i" .c.txt).c\'; done
| bash -x

in pratica l'output di echo è il seguente:

mv 'foo bar2.c.txt' 'foo bar2.c'
mv 'foo_bar2.c.txt' 'foo_bar2.c'
mv 'foo bar.c.txt' 'foo bar.c'
mv 'foo_bar.c.txt' 'foo_bar.c'

il singolo apice fa si che il nome sia preso così com'è, spazi
inclusi, e deve essere letterale quindi lo proteggo da una barra \
dentro echo

#vedi ad es.
echo 'ciao come va' #restituisce:
ciao come va

mentre:
echo \'ciao come va\' #restituisce:
'ciao come va'

se imposto una variabile così:
var="ciao come va.txt"
e faccio:
basename $var .txt #ottengo
basename: operando "va.txt" in più

posso proteggere la variabile (gli spazi) con doppio apice:
basename "$var" .txt #ottengo quello che voglio
ciao come va

questo spiega l'uso dell'apice dentro il comando basename

#quindi
echo mv \'$var\' \'$(basename "$var" .txt).c\' #restituisce
mv 'ciao come va.txt' 'ciao come va.c'

La versione precedentemente proposta:
touch 'foo bar2.c.txt' 'foo bar.c.txt' 'foo_bar.c.txt' 'foo_bar2.c.txt'
IFS=$(echo -en "\n\b") #The Bash for loop splits using a whitespace
(space, tab or newline)
for i in *.c.txt; do echo mv \'$i\' \'$(basename $i .c.txt).c\'; done
| bash 
unset IFS

---e alcune note---
Se pongo IFS=$(echo -en "\n")
var="ciao come va.txt"
basename $var .txt #la variabile non viene spezzata in
corrispondenza degli spazi e quindi funziona senza apici e si ottiene
ciao come va

questo spiega perché funziona anche questa versione.

NOTA: credo che sia importante rimettere a posto IFS con:
unset IFS

In linea di massima credo che questa analisi sia corretta, ma anche
io non sono particolarmente ferrato (del resto è un bel casino 'sta
roba...), spero che serva a qualcuno.
Vi prego di evidenziare le inesattezze, grazie.

> C'è da dire anche questo:
> # ls -l `which sh`
> lrwxrwxrwx 1 root root 4 31 gen 11.54 /bin/sh -> dash

anche qui

> Come risulta evidente, anche la mia conoscenza della shell non è un
> gran che :)

sempre modesto...

> Ivan

Ciao,
Giovanni