#!/bin/bash
Jusque là ça va je présume 🙂
shopt -s globstar
Activation de l'option bash qui va développer ** en "tout élément de l'arborescence à partir du répertoire courant".
for e in **; do
Pour chacun des éléments,
p="${e%/*}"
f="${e##*/}"
définit deux variables p et f qui contiennent respectivement le chemin (path), et le nom de l'élément.
%/* signifie "couper tout ce qui est à droite à partir du dernier slash / de l'élément e", en résulte donc le chemin.
##*/ signifie "couper tout ce qui est à gauche du dernier /", en résulte donc le nom du fichier.
Cela sert à pouvoir traiter le nom du fichier tout en préservant le chemin dans une variable séparée.
[ "${f% *}" != "${f}"
Si dans le nom de fichier f un espace est détecté, la condition est vraie. Pour expliquer il s'agit de "couper tout ce qui se trouve à droite du dernier espace" ( ${f% *} ) et de comparer avec le nom originel "$f". S'il n"y a pas d'espaces dans le nom, alors les 2 chaines sont équivalentes, et la condition se trouve donc fausse.
-a
ET
-f "$e" ]
que l'élément e est bien un fichier, et non un répertoire,
&& echo
Alors affiche,
"${p}/${f// /_}"
le chemin de l'élément, préservé (on ne travaille que sur f), suivi d'un /, suivi du nom de fichier (basename) de l'élément e en remplacant tout espace par un underscore (forme ${var//pattern1/pattern2}, remplacer toute occurence de pattern1 par pattern2 dans la chaine var).
done
Le job est fait 🙂
Escuse moi j'ai mal compris ta question sur l'IFS... Quelle est-elle exactement ?
Pour shopt c'est facile, la commande -s ACTIVE une option, tandis que -u DESACTIVE.
Après pour la liste des options il doit y avoir des traductions de man bash qui trainent quelque part.
Les options de bash peuvent se définir lors de son invocation comme pour toute autre commande (genre bash -a -b -c arg -d ...) sauf que, une fois bash invoqué on ne peut plus modifier la ligne de commande originelle, c'est pourquoi shopt a été inventé : modifier les options dynamiquement DEPUIS bash (ou un script).