[Linuxtrent] Re: Bash, cicli for e nomi di file con spazi vuoti: come fare?

  • From: Lele Gaifax <lele@xxxxxxxxxxxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Sat, 16 Dec 2006 10:22:38 +0100

Paolo Larcheri wrote:
Toshiro:/tmp# IFS=""
Toshiro:/tmp# for i in $(ls); do mv $i /any/path/; done
mv: impossibile fare stat di `f 1.txt\nf 2.txt': No such file or directory

Marco Ciampa wrote:
> ls|while read i ; do mv $i /tmp ; done
>

Infatti, come diceva Flavio, i parametri vanno messi tra virgolette (doppie) quando potenzialmente la loro espansione può contenere spazi; non ho provato la ricetta di Marco, ma direi che soffre dello stesso problema. Per quanto riguarda la prima, da bash(1):

vvvvvvvvvvvvvvvvvvvvvvv
IFS    L'  Internal  Field Separator (separatore di campo interno) che è
       usato per la suddivisione  in  parole  dopo  l'espansione  e  per
       dividere  le linee in parole con il comando incorporato read.  Il
       valore di default è ``<space><tab><newline>''.
^^^^^^^^^^^^^^^^^^^^^^^

e più avanti:

vvvvvvvvvvvvvvvvvvvvvvv
Suddivisione in parole
La shell scandisce il risultato  dell'espansione  di  parametro,  sosti-
tuzione di comando ed espansione aritmetica, che non si trovano tra vir-
golette, per effettuare la suddivisione in parole.

La shell tratta ogni carattere di IFS come un delimitatore, e spezza  in
parole,  in  coincidenza  di  questi  caratteri, i risultati delle altre
espansioni.  Se il valore di IFS è esattamente <space><tab><newline>, il
default, allora qualsiasi sequenza di caratteri IFS serve per delimitare
le parole.  Se IFS ha un valure diverso dal default, allora sequenze  di
caratteri  di  spaziatura space e tab sono ignorati all'inizio e fine di
parola, fin tanto che il carattere di spaziatura è nel valore di IFS (un
carattere  di spaziatura IFS ).  Qualunque carattere in IFS che non è un
carattere  di  spaziatura  IFS,  insieme  con  qualsiasi  carattere   di
spaziatura  IFS adiacente, delimita un campo.  Una sequenza di caratteri
di spaziatura IFS è anche trattata come un delimitatore.  Se  il  valore
di  IFS è nullo, non avviene alcuna suddivisione in parole.  IFS non può
essere non posto.
^^^^^^^^^^^^^^^^^^^^^^^

Che, a parte la traduzione un po' febbricitante, spiega quando entra in gioco la separazione in parole. Proprio per evitare questo genere di garbugli preferisco da sempre la forma che usa xargs(1), molto più potente, in genere più efficiente, e sempre più sicura, ma Napo la escludeva esplicitamente... ma che ha i suoi "difetti" (vedi il recente thread "Cambiare ricorsivamente il proprietario di file (e cartelle)")

Ciao, lele.

--
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: