Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Retourner aux forums || Retourner au forum Programmation.shell

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)

--
No troll found in this incoming post.
Checked by ATG.
Version: 7.4.821 / Trollifiante Database: 247.13.2/1101 - Release Date: 30/04/2008 12:29
> Lire le message (4 commentaires, moyenne: 2,5).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

IFS

Posté par unk () le 02/09/2007 à 09:35. (lien). Évalué à 3.

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 :


IFS='
'
for A in * ; do ln -sf $A `echo $A | tr '[A-Z]' '[a-z]'` ; done


A+

  • [^]Re: IFS

    Posté par Farvardin (page perso, ) le 02/09/2007 à 17:24. (lien). Évalué à 2.

    merci de l'astuce. Par contre j'ai fais un export IFS=@ à la place...

    --
    No troll found in this incoming post.
    Checked by ATG.
    Version: 7.4.821 / Trollifiante Database: 247.13.2/1101 - Release Date: 30/04/2008 12:29

et avec des guillemets ?

Posté par Ernest H (Jabber id, ) le 02/09/2007 à 10:48. (lien). Évalué à 3.

Il ne suffit pas de metre des guillemets autour de $A et de `echo...` ?

Pour moi (avec zsh), la commande
for a in *; do ln -s "$a" "$(echo $a | tr '[A-Z]' '[a-z]')" ; done
marche parfaitement. (enfin à condition que tous les fichiers aient une majuscule dans leur nom et sur une partition case-sensitive...

  • [^]Re: et avec des guillemets ?

    Posté par Farvardin (page perso, ) le 02/09/2007 à 17:23. (lien). Évalué à 2.

    super, cela fonctionne très bien ! Je n'y avais pas pensé...
    Merci beaucoup.

    --
    No troll found in this incoming post.
    Checked by ATG.
    Version: 7.4.821 / Trollifiante Database: 247.13.2/1101 - Release Date: 30/04/2008 12:29

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.shell