Linux: ciclo for su nomi con spazi

Mi è successo di dovere eseguire delle operazioni su una lunga serie di files contenuti in una directory condivisa con samba. Per semplificarmi la vita (ricordo che non sono un programmatore…) ho deciso di popolare un array con il path dei files e di scorrerlo per eseguire le operazioni su di essi.

I primi problemi sono nati in fase di parsing dei nomi dei files: se sono presenti degli spazi samba li esporta inserendo i nomi tra “apici singoli”. Inoltre, quando il nome viene processato, ogni sezione del nome tra due spazi è considerata come un elemento dell’array.

Ho trovato delle indicazioni piuttosto interessanti su questo sito: si parla di ridefinizione del Internal field separator ($IFS). Si tratta di una variabile di sistema che definisce il carattere o i caratteri che sono utilizzati per separare una stringa in sottostringhe. Tipicamente è impostato come “spazio” o “tab” o “newline”. In ambiente Linux è impostato a “spazio”. Ridefinire questa variabile consente di istruire il sistema a non considerare lo spazio come separatore. 

Una volta che la variabile è stata ridefinita, lo spazio non è un separatore ed i nomi files non vengono “spezzettati” in tanti frammenti. Importante ricordare che la variabile deve essere reimpostata al valore originale prima che lo script termini.

SAVEIFS=$IFS
IFS=$(echo -en “\n\b”)
for i in `ls -ld $MOUNT_POINT1/* | awk ‘{ print substr($0, index($0,$9)) }’ `
do
ARRAY_FOLDER[ARRAY_INDEX_FOLDER]=$i
ARRAY_INDEX_FOLDER=$[ $ARRAY_INDEX_FOLDER+1]
done
IFS=$SAVEIFS