[Shell/sh] Parcours recursif de répertoire et création de liens

Parcours recursif de répertoire et création de liens [Shell/sh] - Shell/Batch - Programmation

Marsh Posté le 28-01-2010 à 00:06:26    

Bonjour,
 
Je tente de mettre en place une structure de répertoire ayant des liens symbolique d'une autre même structure de répertoire d'un autre dossier :
càd que j'ai au départ :
 
parent1
-------dossier1
---------------sous_dossier1
-------dossier2
-------dossier3
---------------sous_dossier3
 
 
parent2
-------dossier1
---------------sous_dossier1
-------dossier2
-------dossier3
---------------sous_dossier3
 
ce que je voudrais faire dans le "parent2" :
 
parent2
-------dossier1
-------lien_sur_parent1_dossier1
---------------sous_dossier1
---------------lien_sur_parent1_dossier1_sous_dossier1
-------dossier2
-------lien_sur_parent1_dossier2
-------dossier3
-------lien_sur_parent1_dossier3
---------------sous_dossier3
---------------lien_sur_parent1_dossier3_sous_dossier3
 
Je compte faire ça en PHP mais il me semblerait qu'on pourrait le faire en shell (linux bash sh).
Quelqu'un pourrait me donner un script de départ ?
est-ce qu'un find est bien approprié ?
Le but aussi c'est que plus tard, si je rajoute des dossier dans parent1 (et bien sur dans parent2), le script ne recrée que les liens manquants.
 
Merci.


Message édité par itou le 05-08-2011 à 09:55:48
Reply

Marsh Posté le 28-01-2010 à 00:06:26   

Reply

Marsh Posté le 28-01-2010 à 17:13:20    

Bon,
j'ai finalement fait le script en PHP.
mais si y'en a qui veulent tenter le script shell, je ne refuse pas.

Reply

Marsh Posté le 28-01-2010 à 17:18:13    

ca doit se faire oui... (un truc a base de find, de test et de mkdir)
 
c'est quoi le but fonctionnel? parce que la je vois pas trop, mais je pense que ca peut aider à trouver une solution intelligente.

Reply

Marsh Posté le 31-01-2010 à 12:19:34    

itou a écrit :

Bon,
j'ai finalement fait le script en PHP.
mais si y'en a qui veulent tenter le script shell, je ne refuse pas.


http://fr.lang.free.fr/cours/Shell_v2.0.pdf page 72


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-08-2011 à 18:29:56    

Bonjour,
je redéterre ce topic car ma fonction php ne marche plus sur certain serveur.
Je reviens donc sur un script shell ou plus simplement sur une seule ligne de commande :
 
Je commence donc ainsi :
cd parent2
find -type d | xargs -0 echo ...
 
ça me liste donc que les répertoire et renvoi le nom du répertoire à echo pour les affichier.
de là, il me faudrait donc faire un ln -s /parent1/[argument de xargs] /parent2[argument de xargs]/[nomdu lien]
 
mais comment faire ?
merci

Reply

Marsh Posté le 04-08-2011 à 22:26:52    

pour [argument de xargs] : xargs -i
 
find -type d | xargs -n1  -i{} ln -s /parent1/{} /parent2/{}/[nomdu lien]  
 
 
 


---------------
oui oui
Reply

Marsh Posté le 04-08-2011 à 22:57:23    

ah merci, c'est presque ça, j'avais cherché à comprendre le -i{} sans succes. Je vois maintenant comment ça fonctionne.
Bon pour mon truc c'est presque bon, faut juste que j'arrive à enlever le "."
 
find -type d | xargs -n1 -t -i{} ln -s /parent1{} /parent2{}/[nomdu lien]  
me donne  
ln -s /parent1./dossier1 /parent2./dossier1/lien_sur_parent1
 
edit: ok je pense avoir trouvé :
 
cd parent1
find -type d | cut -c2- | xargs -n1 -t -i{} ln -s /parent2{} /parent1{}/[nomdu lien]
 
 
Edit 2 : aarrgh, cette commande ne peut pas se relancer deux fois : ça fait des liens sur des liens à ne plus en finir !!!  tester s'il y a déjà le lien dans le répertoire ? comment faire ?
merci


Message édité par itou le 05-08-2011 à 09:54:35
Reply

Marsh Posté le 06-08-2011 à 23:52:49    

ok,
j'ai fini par passer par un script bash.
 
------------------
for f in `find -type d | cut -c2-`
do
 echo -e "\nrepertoire : $f"  
 if [ -d ".$f/lien" ]
 then
  echo "Liens existent"
 else
  echo "creation de lien vers /parent2$f"
  ln -s /parent2$f /parent1$f/lien
 fi
done
---------------------------

Reply

Sujets relatifs:

Leave a Replay

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