Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Créer des liens symboliques à partir d'un fichier

31 réponses
Avatar
François Valenduc
Bonjour à tous,
J'essaie de créer des liens symboliques à partir d'un fichier. J'utilise
le script suivant:

#!/bin/bash
cd /home/francois/Images/test
rm -f *
for i in $( cat /home/francois/config/liste ); do
echo $i
ln -s "$i" .
done

Le fichier "liste" contient donc une liste de fichier pour lequel je
veux créer des liens symboliques dans le fichier "test". Le but est
d'utiliser ensuite ce dossier comme source d'images de fond d'écran avec
KDE. Le problème est que çà ne fonctionne pas pour les noms de fichier
contenant des espaces.

Quelqu'un connaît-il une solution à mon problème ?
Merci d'avance,

François Valenduc

10 réponses

1 2 3 4
Avatar
Benoit Izac
Bonjour,

le 08/08/2011 à 19:33, Fabien LE a écrit dans le message
:

if test /home/francois/Images/test; then
rm -f /home/francois/Images/test/*



mkdir rep 2> /dev/null
chdir rep || exit
rm -f *



Entre autres, que se passe-t-il si /home/francois/Images/test est un
fichier ?



chdir va échouer et rm ne sera pas exécuté.



Et les liens seront créés dans le répertoire courant.



[J'ai remis un peu d'ordre pour voir l'historique]

Je ne comprends pas ta remarque, de quels liens parles-tu ?

--
Benoit Izac
Avatar
Fabien LE LEZ
On Mon, 08 Aug 2011 21:16:26 +0200, Benoit Izac :

Je ne comprends pas ta remarque, de quels liens parles-tu ?


Subject: Re: Créer des liens symboliques



Cf aussi : message initial.
Avatar
Benoit Izac
Bonjour,

le 08/08/2011 à 21:45, Fabien LE a écrit dans le message
:

Je ne comprends pas ta remarque, de quels liens parles-tu ?




Subject: Re: Créer des liens symboliques



Cf aussi : message initial.



Bon je le remets :

#!/bin/bash
cd /home/francois/Images/test
rm -f *
for i in $( cat /home/francois/config/liste ); do
echo $i
ln -s "$i" .
done

J'ai la flemme de remettre ce que tu as coupé mais explique-moi quel est
le problème ici :

#!/bin/bash
mkdir /home/francois/Images/test 2> /dev/null
cd /home/francois/Images/test || exit
rm -f *
for i in $( cat /home/francois/config/liste ); do
echo $i
ln -s "$i" .
done

--
Benoit Izac
Avatar
Benoit Izac
Bonjour,

le 07/08/2011 à 23:19, Nicolas George a écrit dans le message
<4e3f0153$0$23696$ :

mkdir rep 2> /dev/null
chdir rep || exit


^^^^^

J'avais même pas vu. Tu fais trop de C ou tu es passé sous Windows ? ;)

--
Benoit Izac
Avatar
Philippe Naudin
Le dim 07 aoû 2011 19:55:15 CEST, Francois Lafont a écrit:

Bonjour,

J'avais posé une question plus ou moins connexe il y a quelques temps
ici même et on m'avait donné comme solution un truc dans le genre ç a :

#--------------------------------------
#!/bin/bash

cd /home/francois/Images/test
rm -f *

cat /home/francois/config/liste | while read i; do
echo "$i"
ln -s "$i" .
done
#--------------------------------------

Voici le fil en question :
https://groups.google.com/group/fr.comp.os.linux.configuration/browse_thr ead/thread/dbd5c5c059ec6e04?hl=fr#

Si jamais vous avez des fichiers dont le nom commence ou se termine par
des espaces, alors il faut ajouter « IFS=$'n' » au script ci-dessus
entre le « while » et le « read ».



Il y a aussi :

#!/bin/bash
while read ; do
echo $REPLY
ln -s "$REPLY" .
done < /home/francois/config/liste

Inutile dans ce cas de modifier IFS.

--
Philippe
Avatar
Fabien LE LEZ
On Mon, 08 Aug 2011 21:53:07 +0200, Benoit Izac
:

J'ai la flemme de remettre ce que tu as coupé mais explique-moi quel est
le problème ici :



Je répondais à François, qui demandait pourquoi sa solution

if test /home/francois/Images/test; then
rm -f /home/francois/Images/test/*
else
mkdir /home/francois/Images/test/
fi
[+ création de liens]

ne convenait pas.
Avatar
Benoit Izac
Bonjour,

le 08/08/2011 à 22:25, Fabien LE a écrit dans le message
:

J'ai la flemme de remettre ce que tu as coupé mais explique-moi quel
est le problème ici :



Je répondais à François, qui demandait pourquoi sa solution



Non, tu répondais à Doug713705 qui répondait à Nicolas.

--
Benoit Izac
Avatar
Nicolas George
Francois Lafont , dans le message
<4e4071ff$0$439$, a écrit :
while read ; do
echo $REPLY
ln -s "$REPLY" .
done < /home/francois/config/liste



Ah oui en effet, merci. Je retiendrai le coup du REPLY. On est bien
d'accord que ce code est strictement équivalent à ceci ?

cat /home/francois/config/liste | while read ; do
# blabla...
done



Non, absolument pas, pour exactement la même raison que « wc < fichier »
n'est pas équivalent à « cat fichier | wc » : dans un cas le programme lit
directement le fichier, dans l'autre il y a cat qui fait une copie de
mémoire à mémoire.
Avatar
Luc.Habert.00__arjf
Francois Lafont :

Ah oui en effet, merci. Je retiendrai le coup du REPLY.



Attention, c'est un bashisme, ce n'est pas du sh standard.

On est bien d'accord que ce code est strictement équivalent à ceci ?

#!/bin/bash
cat /home/francois/config/liste | while read ; do
# blabla...
done



Tout dépend de ce qu'on entend par strictement. Ça va donner le meme
résultat (et encore, si le chemin d'accès que tu donnes à cat commence par
un --, tu vas avoir des surprises), mais sous le capot, il ne se passe pas
la meme chose. Classiquement, on appelle ça un uuoc (useless use of cat).

Je pose la question car j'ai voulu faire des tests et j'ai eu des
étrangetés que je n'arrive pas à reproduire (du genre en tapant dans
l'interpréteur « cat toto | while read ; do <ENTER> » j'avais un nouveau
prompt qui s'affichait comme si la commande que j'avais commencée à
taper était achevée).



Ça, c'est parce que le do n'est pas terminé. Comme le shell est gentil,
plutot que de te jeter avec un syntax error, il te prompte pour la suite de
la boucle.
Avatar
Francois Lafont
Le 09/08/2011 10:13, Nicolas George a écrit :

Non, absolument pas, pour exactement la même raison que « wc < fichier »
n'est pas équivalent à « cat fichier | wc » : dans un cas le programme lit
directement le fichier, dans l'autre il y a cat qui fait une copie de
mémoire à mémoire.



Ok, merci beaucoup pour ces explications Nicolas. J'essayerai donc
d'utiliser plus souvent la construction « wc < fichier ». J'ai parlé de
cat car j'ai toujours trouvé que c'était plus lisible à mon goût.


--
François Lafont
1 2 3 4