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,
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
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 :
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
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
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.
On Mon, 08 Aug 2011 21:53:07 +0200, Benoit Izac
<use.reply.to@INVALID.ADDRESS>:
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]
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
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.
Francois Lafont , dans le message
<4e4071ff$0$439$426a34cc@news.free.fr>, 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.
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.
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.
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.
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.
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
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.
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.