OVH Cloud OVH Cloud

script avec diff, grep et sed

16 réponses
Avatar
Lionel GRUHN
bonjour à tous

J'ai fait un petit script dont le but est de me donner la liste des fichiers
qui sont dans un répertoire new mais pas dans le répertoire old. Le contenu
de ces fichiers ne m'intéresse pas; les répertoires contiennent environ
2000 fichiers.



#! /bin/bash

# pipe avec sort pour etre sur d'etre dans l'ordre alphabetique
ls -1 old | sort > ls.old
ls -1 new | sort > ls.new

# normalement, pas de pb avec la casse des noms de fichier mais mefiance...
# je ne veux que les lignes commencant par "> " (ajouts dans new)
# je ne veux pas que ces caractères figurent dans le fichier final
diff -i ls.old ls.new | grep '^> ' | sed "s/^> //" > ls.diff

# supprimer les fichiers intermediaires
rm -f ls.old
rm -f ls.new




Le script fonctionne et je cherche à l'optimiser (plus par principe que par
nécessité):
- le tri de la sortie de ls est-il vraiment nécessaire?
- je voudrais supprimer l'usage de fichiers temporaires (ls.old et ls.new),
mais je ne sais pas rediriger la sortie de mes 2 ls vers l'entrée de diff.
Si je donne directement les répertoires à diff, celui-ci va me comparer le
contenu des fichiers (je n'ai pas trouvé d'option correspondant à ce que je
veux).
- existe-t-il un moyen de réduire la chaîne de pipes diff | grep | sed ?
- aucun de mes noms de fichiers ne contient d'espace, mais j'ai fait
quelques tests et le script fonctionne quand même. A priori, il me semble
que celà doit toujours être le cas, pouvez-vous me le confirmer?


Merci d'avance

Lionel Gruhn, programmeur du dimanche

6 réponses

1 2
Avatar
Lionel GRUHN
Laurent Wacrenier wrote:

Avec "ls" direct, il faut en garder un. Mais avec find, il y a peut
être moyen de se passer de fichier temporaire :

find old new -type f | sort -t / -k 2 | ...


Effectivement, on va avoir les fichiers des 2 répertoires sans passer par un
fichier temporaire, mais tous dans la même liste.

Il faut que je compare les noms de fichiers, mais que je garde le chemin
pour savoir à quel répertoire ils appartiennent...

J'ai essayé de voir ce que je pouvais tirer du fichier mais ça devient très
vite le bronx: mes compétences sont explosées et je ne sais pas faire...
Dire qu'avec 2 fichiers, join fait tout tout seul!

Merci de t'être intéressé à mon problème, mais je crois que je vais garder
mon fichier temporaire...

Lionel

Avatar
Jacques L'helgoualc'h
Le 09-03-2005, Lionel GRUHN a écrit :
[...]
Dire qu'avec 2 fichiers, join fait tout tout seul!


Sans fichier temporaire, sous bash :

join -v 1 <(cd new && ls -1) <(cd old && ls -1)

--
Jacques L'helgoualc'h

Avatar
Lionel GRUHN
Jacques L'helgoualc'h wrote:

Le 09-03-2005, Lionel GRUHN a écrit :
[...]
Dire qu'avec 2 fichiers, join fait tout tout seul!


Sans fichier temporaire, sous bash :

join -v 1 <(cd new && ls -1) <(cd old && ls -1)



ça c'est beau, je l'encadre!

Et bien on peut dire qu'on est loin de la première version!

Juste pour les archives:

Sous bash, comment lister les fichiers qui sont contenus dans le répertoire
new et qui ne figurent pas dans le répertoire old?

join -v 1 <(ls -1 new) <(ls -1 old)



Merci à tous ceux qui m'ont accordé un peu de leur temps. Votre aide et vos
remarques m'ont permis de me coucher moins bête ce soir qu'il y a deux
jours.


Lionel


Avatar
Laurent Wacrenier
Jacques L'helgoualc'h <lhh+ écrit:
Le 09-03-2005, Lionel GRUHN a écrit :
[...]
Dire qu'avec 2 fichiers, join fait tout tout seul!


Sans fichier temporaire, sous bash :

join -v 1 <(cd new && ls -1) <(cd old && ls -1)


L'option "-1" est superflue. C'est le comportement par défaut
quand la sortie n'est pas un terminal.


Avatar
Jacques L'helgoualc'h
Le 11-03-2005, Laurent Wacrenier a écrit :
Jacques L'helgoualc'h <lhh+ écrit:
[...]

Sans fichier temporaire, sous bash :



ou sous zsh, mais pas le /bin/sh de bash

join -v 1 <(cd new && ls -1) <(cd old && ls -1)


L'option "-1" est superflue. C'est le comportement par défaut
quand la sortie n'est pas un terminal.


Ah oui, merci --- je testais au terminal... où il faut aussi se méfier
d'un alias possible sur ls.
--
Jacques L'helgoualc'h


Avatar
Laurent Wacrenier
Jacques L'helgoualc'h <lhh+ écrit:
Ah oui, merci --- je testais au terminal... où il faut aussi se méfier
d'un alias possible sur ls.


Les alias de bash sont sensés être définis dans .bashrc qui est lancé
en mode interactif uniquement.

1 2