Programmation.shell : liens symboliques récursifs pour fichiers avec espaces
Posté par Farvardin (page perso, ) le 01 septembre 2007
bonsoir les vétérans du shell !
J'ai un dossier avec des sous-dossiers contenant des espaces. Ces sous-dossiers contiennent eux-même des fichiers avec parfois des espaces.
[http://www.inform-fiction.org/I7Downloads/Extensions/]
C'est pour un programme dont la version linux vient de sortir récemment, et malheureusement pour la version linux il faut avoir les noms de tous ces fichiers en minuscules (mais avec espace). Il faut donc utiliser des liens symboliques vers les fichiers avec les majuscules. Si ce n'était que cela, cela pourrait encore aller, par exemple avec ce script on peut faire des liens automatiquement :
for A in * ; do ln -sf $A `echo $A | tr '[A-Z]' '[a-z]'` ; done
mais les espaces m'empêchent de lancer des scripts pour le faire automatiquement.
avec ça on peut remplacer les espaces par des tirets bas, mais du coup les liens ne vont plus se faire comme prévu :
find . -type f -name "* *" -print0 | perl -n0e '$old = $_; s/ /_/g; rename $old, $_'
une idée pour garder le meilleur des deux et pouvoir générer automatiquement ces liens symboliques ?
(oui je sais, les fichiers avec des espaces, c'est MAL, je déteste cela de façon générale)
J'ai un dossier avec des sous-dossiers contenant des espaces. Ces sous-dossiers contiennent eux-même des fichiers avec parfois des espaces.
[http://www.inform-fiction.org/I7Downloads/Extensions/]
C'est pour un programme dont la version linux vient de sortir récemment, et malheureusement pour la version linux il faut avoir les noms de tous ces fichiers en minuscules (mais avec espace). Il faut donc utiliser des liens symboliques vers les fichiers avec les majuscules. Si ce n'était que cela, cela pourrait encore aller, par exemple avec ce script on peut faire des liens automatiquement :
for A in * ; do ln -sf $A `echo $A | tr '[A-Z]' '[a-z]'` ; done
mais les espaces m'empêchent de lancer des scripts pour le faire automatiquement.
avec ça on peut remplacer les espaces par des tirets bas, mais du coup les liens ne vont plus se faire comme prévu :
find . -type f -name "* *" -print0 | perl -n0e '$old = $_; s/ /_/g; rename $old, $_'
une idée pour garder le meilleur des deux et pouvoir générer automatiquement ces liens symboliques ?
(oui je sais, les fichiers avec des espaces, c'est MAL, je déteste cela de façon générale)
> Lire le message (4 commentaires, moyenne: 2,5).
Vous avez demandé le commentaire #863246.



IFS
Avec bash (et probablement d'autres shells), voir la variable d'environnement "IFS" (Internal Field Separator) ; par défaut, l'espace est un séparateur du point de vu du shell, ce qui doit être la cause du problème.
En utilisant uniquement le retour chariot comme séparateur, ça doit donner le code suivant :
A+
[^]Re: IFS
merci de l'astuce. Par contre j'ai fais un export IFS=@ à la place...
Tous ensemble contre l'esclavitude des logiciels privateurs !