Script unix - comparer plusieurs repertoires

Fermé
pio_killer Messages postés 61 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 15 avril 2016 - 19 janv. 2007 à 06:14
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 28 janv. 2007 à 11:33
Bonjour,
Tout d'abord, sachez que je suis novice en matière de script unix.
Voici mon problème:

J’ai 3 repertoires.

REP01 (repertoire de 1 er niveau)
REP02 (repertoire de 2 ème niveau)
REP03 (repertoire de 3 ème niveau)

Dans chaques repertoire, il y a des fichiers texte.
Les fichiers suivent le parcours suivant:
-On crée un fichier dans REP03
-On le déplace dans REP02
-On le déplace pour le stocker dans REP01

Si on veut modifié un fichier, on le copie dans REP03 et on refait le parcours. Dans cas, on se trouve avec le même fichier dans 2 repertoires.
---------------------------------------------------------------------------------
Exemple:
Liste des noms de fichier:
Titi
Toto
Tutu
Tata

Position des fichiers.

Fichier dans REP03
Titi
tutu

Fichier dans REP02
toto

Fichier dans REP01
Tutu
tata

En fait les fichiers sont, positionnés soit dans REP01 ou REP02 ou REP03 tout en sachant qu’ils peuvent se trouver dans REP01 qui est le repertoire final.

Je voudrais sortir une liste des fichier en fonction de leur position mais en gardant toujours le plus grand niveau.

Pour cet exemple:

/REP03/titi
/REP03/tutu
/REP02/toto
/REP01/tata
ici, on ne prend pas tutu dans REP01 car il se trouve dans REP3 (REP03 qui est d’un niveau superieur).

Ensuite, pour chaque fichier, il faudrait récupérer la première ligne.

Et mettre le tout dans un fichier nommé “extract”.
A voir également:

4 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
20 janv. 2007 à 13:48
Salut,
[jp@MDK tmpfs]$ ls -R

.:
REP01/  REP02/  REP03/

./REP01:
Tata  Tutu

./REP02:
Toto

./REP03:
Titi  Tutu

[jp@MDK tmpfs]$ for fich in $(find . -type f); do (echo -e "$fich : \c") >> fich.txt && sed -n '1p' $fich >> fich.txt; done

[jp@MDK tmpfs]$ cat fich.txt | sed 's%/% %2' | sort -r +2 | uniq -f 2 | sort -r | sed 's% %/%1;s%\.%%' > extract.txt

[jp@MDK tmpfs]$ cat extract.txt

/REP03/Tutu : Ceci est la 1ère ligne de Tutu
/REP03/Titi : Ceci est la 1ère ligne de Titi
/REP02/Toto : Ceci est la 1ère ligne de Toto
/REP01/Tata : Ceci est la 1ère ligne de Tata

[jp@MDK tmpfs]$
;-))
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
20 janv. 2007 à 14:32
[jp@MDK tmpfs]$ for fich in $(find . -type f); do (echo -e "$fich : \c") >> fich.txt && sed -n '1p' $fich >> fich.txt; done

[jp@MDK tmpfs]$ cat fich.txt | sed 's%/% %2' | sort -r +2 | uniq -f 2 | sort -r | sed 's% %/%1;s%\.%%' > extract.txt


Quelle barbarie!! :-))
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
20 janv. 2007 à 14:39
..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le... plaisir de se faire ...












































... suer ;-)

JP. Hannibal Lecter de service ;-))
0
pio_killer Messages postés 61 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 15 avril 2016
22 janv. 2007 à 19:49
Bonjour,
tes commandes marchent bien mais seulement pour des repertoires nommés comme dans cet exemple.
Je voudrais en fait pouvoir, pour autant de repertoire nécessaire, donner un ordre.
Par exemple (toujours avec le système de niveau):

répertoire "travail" => niveau3
répertoire "fini" => niveau 2
répertoire "stockage"=> niveau 1

Il faut tjrs le niveau le plus haut.
0
pio_killer Messages postés 61 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 15 avril 2016
28 janv. 2007 à 10:26
Y'a personne qui peut m'aider ?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
28 janv. 2007 à 11:29
Salut,

tes commandes marchent bien mais seulement pour des repertoires nommés comme dans cet exemple.

Ton affirmation est fausse.
Dans son exemple jipicy n'utilise pas des répertoires nommés (enfin un répertoire doit avoir un nom), il cherche dans l'arborescence de répertoire courant qui dans son cas est tmpfs.
Il s'en fiche completement de ce qu'il y a dédans
Cette commande cherche toutes le fichier de type regulier dans le répertoire courn et ensuite par rapport à leur appartenance il fait le traitement
for fich in $(find . -type f)
Donc peut être tu dois être un peu plus clair.

D'ailleurs il a fait ce que tu as demandé
J’ai 3 repertoires.

REP01 (repertoire de 1 er niveau)
REP02 (repertoire de 2 ème niveau)
REP03 (repertoire de 3 ème niveau)


Si je ne me trompe pas maintenant tu veux autre chose

supposons que la racine de ton arborescence s'appelle sauvegarde
donc /home/user/sauvegarde

tu veux dire que

répertoire "travail" => niveau3
répertoire "fini" => niveau 2
répertoire "stockage"=> niveau 1

travail, fini, stockage se trouve dans sauvegarde mais qu'ils ont un certains niveau?!
en ce cas il faut etablir manuellement le niveau avec un couple de genre
nom=>niveau

perso je ne comprends pas exactement ce que tu veux.

tu peux détailler avec un exemple de ce que tu veux obtenir
1. la diversité de l'arborescence de départ
2. ce que tu veux obtenir
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
28 janv. 2007 à 11:33
Ben tu exécutes le script sans te soucier des noms de répertoires.
Puis une fois que tu as ton fichier "extract", tu affectes les répertoires qui t'intéressent à des variables :
niv1="stockage"
niv2="fini"
niv3="travail"
puis tu à l'aide de "grep" tu filtres le tout :
grep $niv3 extract.txt | sort >> final.txt
grep $niv2 extract.txt | sort >> final.txt
grep $niv1 extract.txt | sort >> final.txt
;-)
0