Re: script tar con nomi directory contenenti spazi

2016-09-26 Per discussione Marco Romano

Il 26/09/2016 00:37, beppe ha scritto:

Lo script funziona bene finche' non incontra una directory con spazi:
echo $data
#IFS_OLD=$IFS
#IFS=$'\n'

# per controllare la data
sleep 2
for i in $(ls -d /home/prove/*/ | cut -f4 -d'/' | sed 's/\ /\\ /g'); 
do tar -cvzf $data'_'${i%%/} '/home/prove/'${i%%/}; done


#IFS=$IFS_OLD




Evita di usare il comando ls nei cicli for e ti risparmi un sacco di 
problemi:


for i in /home/prove/*; do
if [ -d "$i" ]; then
# è una directory
tar -cvzf ${data}_"$(basename "$i")" "$i";
fi
done

--
Kind regards,

Marco Romano



Re: script tar con nomi directory contenenti spazi

2016-09-26 Per discussione beppe

Il 26/09/2016 12:12, Piviul ha scritto:

beppe ha scritto il 26/09/2016 alle 00:37:

Lo script funziona bene finche' non incontra una directory con spazi:

$ cat tar_backup.sh
#!/bin/bash
data=$data$(date | cut -d ' ' -f6 | cut -c 1-4)
data=$data$(date | cut -d ' ' -f2)
data=$data$(date | cut -d ' ' -f3)
echo $data
a questo punto permettimi anche di farti qualche pulce sulla ricerca 
della data; non è più semplice ricavarla con:


data=$(date +%Y%b%d)

(anche se userei +%Y%b%d solo per il fatto che puoi ordinare i backup 
effettuati per data più facilmente...) piuttosto che con 3 chiamate al 
comando date che fra le altre cose può essere prono agli errori in 
quanto dipende dalle impostazioni di default del comando date?


Piviul

Grazie, e' vero... uso spesso cut per i campi e spesso non cerco la cosa 
piu' ovvia.


ciao
Bepep

--
le nuvole non hanno regole,
perchè non hanno mai rinunciato
alla libertà di sognare.



Re: script tar con nomi directory contenenti spazi

2016-09-26 Per discussione Piviul

Piviul ha scritto il 26/09/2016 alle 12:12:

[...]
(anche se userei +%Y%b%d [...]

intendevo +%Y%m%d...ovviamente!

Piviul



Re: script tar con nomi directory contenenti spazi

2016-09-26 Per discussione Piviul

beppe ha scritto il 26/09/2016 alle 00:37:

Lo script funziona bene finche' non incontra una directory con spazi:

$ cat tar_backup.sh
#!/bin/bash
data=$data$(date | cut -d ' ' -f6 | cut -c 1-4)
data=$data$(date | cut -d ' ' -f2)
data=$data$(date | cut -d ' ' -f3)
echo $data
a questo punto permettimi anche di farti qualche pulce sulla ricerca 
della data; non è più semplice ricavarla con:


data=$(date +%Y%b%d)

(anche se userei +%Y%b%d solo per il fatto che puoi ordinare i backup 
effettuati per data più facilmente...) piuttosto che con 3 chiamate al 
comando date che fra le altre cose può essere prono agli errori in 
quanto dipende dalle impostazioni di default del comando date?


Piviul



Re: script tar con nomi directory contenenti spazi

2016-09-26 Per discussione beppe

Il 26/09/2016 09:09, Piviul ha scritto:

beppe ha scritto il 26/09/2016 alle 00:37:

Lo script funziona bene finche' non incontra una directory con spazi:

$ cat tar_backup.sh
#!/bin/bash
data=$data$(date | cut -d ' ' -f6 | cut -c 1-4)
data=$data$(date | cut -d ' ' -f2)
data=$data$(date | cut -d ' ' -f3)
echo $data
#IFS_OLD=$IFS
#IFS=$'\n'

# per controllare la data
sleep 2
for i in $(ls -d /home/prove/*/ | cut -f4 -d'/' | sed 's/\ /\\ /g'); do
tar -cvzf $data'_'${i%%/} '/home/prove/'${i%%/}; done
io credo che il problema risieda nelle linee che hai commentato. Di 
default IFS (Internal File Separator) è lo spazio quindi questo ciclo 
non funziona bene. Devi appunto decommentare le righe che riguardano 
l'IFS.


Poi sinceramente mi sembra anche macchinoso (oltre che non capisco 
cosa faccia il comando ${i%%/} ma questo è un limte mio) il ciclo for 
che hai costruito...


io il ciclo lo riscriverei così:

for d in $(ls -d /home/prove/*); do
   dir=$(basename $d)
   tar cvzf "$data_$dir" "$d"
done

in ogni caso se vuoi mantenere la tua versione ocho che tar considera 
lo spazio come separatore dei suoi argomenti. Devi quindi quotare i 
riferimenti alle dir dentro /home/prove

Ciao
Piviul
i cicli funzionavano tutti correttamente meno che con i nomi directory 
contenenti spazi.

Avevo provato sia con IFS=$'\n',  sia senza.

Con il tuo ciclo for adesso mi sembrano corretti anche con piu' spazi 
nei nomi,

rimettendo IFS=$'\n'.

Grazie 1000!!!

ciao
Beppe

--
le nuvole non hanno regole,
perchè non hanno mai rinunciato
alla libertà di sognare.



Re: script tar con nomi directory contenenti spazi

2016-09-26 Per discussione Piviul

beppe ha scritto il 26/09/2016 alle 00:37:

Lo script funziona bene finche' non incontra una directory con spazi:

$ cat tar_backup.sh
#!/bin/bash
data=$data$(date | cut -d ' ' -f6 | cut -c 1-4)
data=$data$(date | cut -d ' ' -f2)
data=$data$(date | cut -d ' ' -f3)
echo $data
#IFS_OLD=$IFS
#IFS=$'\n'

# per controllare la data
sleep 2
for i in $(ls -d /home/prove/*/ | cut -f4 -d'/' | sed 's/\ /\\ /g'); do
tar -cvzf $data'_'${i%%/} '/home/prove/'${i%%/}; done
io credo che il problema risieda nelle linee che hai commentato. Di 
default IFS (Internal File Separator) è lo spazio quindi questo ciclo 
non funziona bene. Devi appunto decommentare le righe che riguardano l'IFS.


Poi sinceramente mi sembra anche macchinoso (oltre che non capisco cosa 
faccia il comando ${i%%/} ma questo è un limte mio) il ciclo for che hai 
costruito...


io il ciclo lo riscriverei così:

for d in $(ls -d /home/prove/*); do
   dir=$(basename $d)
   tar cvzf "$data_$dir" "$d"
done

in ogni caso se vuoi mantenere la tua versione ocho che tar considera lo 
spazio come separatore dei suoi argomenti. Devi quindi quotare i 
riferimenti alle dir dentro /home/prove


Ciao

Piviul



Re: script tar con nomi directory contenenti spazi

2016-09-26 Per discussione beppe

Il 26/09/2016 04:12, Teodoro Santoni ha scritto:

Ciao,

Il 25/09/16, beppe ha scritto:

Lo script funziona bene finche' non incontra una directory con spazi:

$ cat tar_backup.sh
#!/bin/bash
data=$data$(date | cut -d ' ' -f6 | cut -c 1-4)
data=$data$(date | cut -d ' ' -f2)
data=$data$(date | cut -d ' ' -f3)
echo $data
#IFS_OLD=$IFS
#IFS=$'\n'

# per controllare la data
sleep 2
for i in $(ls -d /home/prove/*/ | cut -f4 -d'/' | sed 's/\ /\\ /g'); do
tar -cvzf $data'_'${i%%/} '/home/prove/'${i%%/}; done

#IFS=$IFS_OLD

avevo provato a ridefinire IFS, ma quando tar riceve i parametri non li
legge correttamente.
(al momento ho risolto rinominando le directory sostituendo gli spazi
con '_'
   ma non e' una buona idea per i files che hanno link ad altri files)

Come argomento a sed potresti provare con 's/ /\\ /g'.

Io rifarei tutto il ciclo del coso in tar da capo a dir il vero, ad esempio con:
printf "%s\n" /home/prove/*/ | while read ; do bn=$(basename $REPLY) ;
tar -cvzf $data"_$bn" "$REPLY" ; done


Perfetto!
Non avevo pensato a basename...

Grazie 1000!!!

ciao
Beppe

--
le nuvole non hanno regole,
perchè non hanno mai rinunciato
alla libertà di sognare.



Re: script tar con nomi directory contenenti spazi

2016-09-25 Per discussione Teodoro Santoni
Ciao,

Il 25/09/16, beppe ha scritto:
> Lo script funziona bene finche' non incontra una directory con spazi:
>
> $ cat tar_backup.sh
> #!/bin/bash
> data=$data$(date | cut -d ' ' -f6 | cut -c 1-4)
> data=$data$(date | cut -d ' ' -f2)
> data=$data$(date | cut -d ' ' -f3)
> echo $data
> #IFS_OLD=$IFS
> #IFS=$'\n'
>
> # per controllare la data
> sleep 2
> for i in $(ls -d /home/prove/*/ | cut -f4 -d'/' | sed 's/\ /\\ /g'); do
> tar -cvzf $data'_'${i%%/} '/home/prove/'${i%%/}; done
>
> #IFS=$IFS_OLD
>
> avevo provato a ridefinire IFS, ma quando tar riceve i parametri non li
> legge correttamente.
> (al momento ho risolto rinominando le directory sostituendo gli spazi
> con '_'
>   ma non e' una buona idea per i files che hanno link ad altri files)

Come argomento a sed potresti provare con 's/ /\\ /g'.

Io rifarei tutto il ciclo del coso in tar da capo a dir il vero, ad esempio con:
printf "%s\n" /home/prove/*/ | while read ; do bn=$(basename $REPLY) ;
tar -cvzf $data"_$bn" "$REPLY" ; done



script tar con nomi directory contenenti spazi

2016-09-25 Per discussione beppe

Lo script funziona bene finche' non incontra una directory con spazi:

$ cat tar_backup.sh
#!/bin/bash
data=$data$(date | cut -d ' ' -f6 | cut -c 1-4)
data=$data$(date | cut -d ' ' -f2)
data=$data$(date | cut -d ' ' -f3)
echo $data
#IFS_OLD=$IFS
#IFS=$'\n'

# per controllare la data
sleep 2
for i in $(ls -d /home/prove/*/ | cut -f4 -d'/' | sed 's/\ /\\ /g'); do 
tar -cvzf $data'_'${i%%/} '/home/prove/'${i%%/}; done


#IFS=$IFS_OLD

avevo provato a ridefinire IFS, ma quando tar riceve i parametri non li 
legge correttamente.
(al momento ho risolto rinominando le directory sostituendo gli spazi 
con '_'

 ma non e' una buona idea per i files che hanno link ad altri files)

Grazie.
ciao
Beppe

--
le nuvole non hanno regole,
perchè non hanno mai rinunciato
alla libertà di sognare.