Forum Programmation.shell liens symboliques récursifs pour fichiers avec espaces

Posté par  .
Étiquettes : aucune
0
1
sept.
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)
  • # IFS

    Posté par  . É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  . Évalué à 2.

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

      Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

  • # et avec des guillemets ?

    Posté par  (site web personnel) . É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  . Évalué à 2.

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

      Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

Suivre le flux des commentaires

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