[BASH] find, xargs, ln et espaces qui me gavent

find, xargs, ln et espaces qui me gavent [BASH] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 01-12-2003 à 12:05:46    

bon là je sèche :(
 
mon probleme :
faire un script qui droppe dans le rep courant des liens symboliques vers tous les *.pdf situés dans le repertoire du dessus et ses sous-rep.
 
en gros, j'ai mon find :  

find .. -name "*.pdf"


 
et pour tous ces fichiers faire un lien symbolique.
 
j'avais pensé à un truc du genre :

for f in `find .. -name "*.pdf" -print0 ; do
    ln -s "$f" `basename $f`
done


 
mais bon le probleme, c'est les espaces :/
J'ai pensé à quelques bout de code pour arranger les choses :

find .. -name "*.pdf" -print0 | xargs -0


ou

find .. -name "*.pdf" | awk -F '\n' '{ print "\""$1"\""}'


 
mais j'y arrive toujours pas  :sweat:  
 
help ?!

Reply

Marsh Posté le 01-12-2003 à 12:05:46   

Reply

Marsh Posté le 01-12-2003 à 12:12:02    

la solution 0 marche, tu peux aussi utiliser l'option -exec de find

Reply

Marsh Posté le 01-12-2003 à 12:16:44    

tu peux developper stp ? :)

Reply

Marsh Posté le 01-12-2003 à 12:34:08    

find .. -name "*.pdf" -print0 | xargs -0
 
ben ça march il me semble. après man find
 
find -name "*.pdf" -exec ls -l {} \;
 
par exemple

Reply

Marsh Posté le 01-12-2003 à 13:15:03    

ok mais comment raccorder mon "ln -s", du genre de

ln -s "$f" `basename $f`

Reply

Marsh Posté le 01-12-2003 à 13:18:13    

ç marche pas
-exec ln -s {} `basename {}` \; ?

Reply

Marsh Posté le 01-12-2003 à 13:26:54    

find .. -name "*.pdf" -exec ln -s {} `basename {}` \;
 
ben ça me sort :
ln: `../rep/fichier.pdf': fichier existant.
 
ça laisse présager, que le basename marche pas top :/

Reply

Marsh Posté le 01-12-2003 à 13:30:30    

find .. -name "*.pdf" -exec "ln -s {} `basename {}`" \;
?

Reply

Marsh Posté le 01-12-2003 à 13:36:22    

find: ln -s ../rep/fichier.pdf ../rep/fichier.pdf: No such file or directory
 
:(


Message édité par bobuse le 01-12-2003 à 13:36:33
Reply

Marsh Posté le 01-12-2003 à 13:38:50    

mouef ... et xargs et les 0 ça marche pas ?
sinon il te faut faire un vrai script ...


Message édité par Taz le 01-12-2003 à 13:39:27
Reply

Marsh Posté le 01-12-2003 à 13:38:50   

Reply

Marsh Posté le 01-12-2003 à 13:43:09    

mouairf :/
 
merci de ton aide en tout cas :)

Reply

Marsh Posté le 01-12-2003 à 13:46:59    

c'est un problème à la con que tout lemonde a en sh. si t'as 2/3 connaissance en perl/python, ça se fait facilement

Reply

Marsh Posté le 01-12-2003 à 13:55:48    

mouais mais à tout prob à la con, une sol à la con :D
 
personne n'aurai la sol à la con dans un petit script de derrière les fagots ? :)

Reply

Marsh Posté le 01-12-2003 à 14:48:09    

bon en fait, je viens de me rendre compte que j'avais pas besoin de passer le basename du fichier en argument de ln :D
par défaut, ln -s chemin/fichier crée un lien dans le rep courant portant le meme nom que le fichier ...
 
ça donne :  

find ".." -name "*.pdf" | awk -F '\n' '{ system("ln -s \""$1"\"" ) }'


(solution possible)

Reply

Marsh Posté le 01-12-2003 à 15:28:46    

bobuse a écrit :

bon en fait, je viens de me rendre compte que j'avais pas besoin de passer le basename du fichier en argument de ln :D
par défaut, ln -s chemin/fichier crée un lien dans le rep courant portant le meme nom que le fichier ...
 
ça donne :  

find ".." -name "*.pdf" | awk -F '\n' '{ system("ln -s \""$1"\"" ) }'


(solution possible)
 


 
Rhaa quelle horreur !!!
Tu te rends compte que tout le temps que tu as passé à chercher une solution, tu aurais pu lire un livre sur bash/shell.
Ou rien qu'un site si tu n'aimes pas les livres.
Ça te permettrait de prendre de bonnes habitudes pour tes scripts.
Là ton script plante dès qu'un nom de fichier contient un espace, un guillemet ou un saut de ligne.
 
Une solution :

Code :
  1. find . -print0 | xargs -0 -n 1 ln -s


 
Le problème est ici que ln est appelé plusieurs fois :/

Reply

Marsh Posté le 01-12-2003 à 15:47:51    

mais je lis régulièrement les man :o
c'est juste que ça m'empêche pas de bloquer des fois .. etpuis on est lundi [:spamafote] petit lundi ... grande semaine
 
haaa ! c'est le "-n 1" qui me manquait :D
 
merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed