[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