1 votes

Gérer le nom de fichier avec espace dans un script shell

Voici ma structure de dossiers.

[définir les liens symboliques ici]
/liens/

[entité]    
/données/a 1/  #(le nom du dossier contient un espace)
/données/b 1/
/données/c 1/
/données/d 1/
.
.
.

Je veux créer un lien symbolique pour chaque entité en une seule fois avec un script shell.

for fichier in /données/*; do
    echo "${fichier}"
    ln -ds "/données/${fichier}" "/liens/${fichier}"
done

Cependant, cela génère une erreur comme ceci.

/données/a 1
ln: impossible de créer le lien symbolique '/données//liens/a 1': Aucun fichier ou dossier de ce type

Je pense que cela est lié aux espaces dans le nom du dossier...???

Comment puis-je résoudre cela??

1voto

Kamil Maciorowski Points 57004

Es-tu sûr que c'est /data//links/a 1 dans le message d'erreur? Je m'attendrais à /links//data/a 1

Les espaces blancs ne sont pas le problème. Regarde ce que ton echo t'a donné. Ton $file contient déjà la chaîne /data/. Le morceau de code

"/data/${file}" "/links/${file}"

ajoute /data/ ou /links/ à une chaîne où /data/ est déjà.

La solution la plus simple est de faire en sorte que $file ne contienne pas du tout /data/:

cd /data
for file in *; do
# le reste de ton script
# en général, rappelle-toi que tu es dans un répertoire différent maintenant

Alternativement, tu peux garder for file in /data/*; et enlever la partie excessive plus tard:

for file in /data/*; do
file=$(basename "$file")
# le reste de ton script

La solution ci-dessus va générer plusieurs processus car basename est un exécutable séparé. Pour cette raison, tu veux peut-être que le travail soit fait par le shell lui-même:

for file in /data/*; do
file="${file##*/}"
# le reste de ton script

La syntaxe ${file##*/} imprime $file mais enlève la chaîne la plus longue correspondant à */ depuis le début de celle-ci. L'effet est qu'il te donne tout ce qui se trouve après le dernier /.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X