recherche de fichiers

Le
octane
Bonjour,

suite a une manipulation hasardeuse, je crains avoir un probleme de
mail.

Le serveur est sendmail, et les mails sont rangés dans deux fichiers,
un
df<id> qui correspond au corps du mail
et un
[qQ]f<id> qui correspond a son etat.

Je cherche une regexp qui pourrait m'afficher tous les fichiers df<id>
qui n'ont
pas de [qQ]f<id> correspondant pour les supprimer.

J'ai un peu de mal a trouver.

Il y a plusieurs milliers de fichiers donc tout ce qui est base de
Q* echoue avec un "argument list too long"..

Merci
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alain Ketterlin
Le #117317
writes:

Le serveur est sendmail, et les mails sont rangés dans deux
fichiers, un df<id> qui correspond au corps du mail et un [qQ]f<id>
qui correspond a son etat.

Je cherche une regexp qui pourrait m'afficher tous les fichiers
df<id> qui n'ont pas de [qQ]f<id> correspondant pour les supprimer.


Quelque chose du genre (avec bash):

find . -name df*
| while read F; do
if [ ! -f "[qQ]f${$F#df}" ]; then
echo "$F"
fi
done

Je te laisse remplacer echo par ce que tu veux.

-- Alain.

ALain Montfranc
Le #117171
Alain Ketterlin a écrit
writes:

Le serveur est sendmail, et les mails sont rangés dans deux
fichiers, un df<id> qui correspond au corps du mail et un [qQ]f<id>
qui correspond a son etat.

Je cherche une regexp qui pourrait m'afficher tous les fichiers
df<id> qui n'ont pas de [qQ]f<id> correspondant pour les supprimer.


Quelque chose du genre (avec bash):

find . -name df*
while read F; do
if [ ! -f "[qQ]f${$F#df}" ]; then

echo "$F"
fi
done

Je te laisse remplacer echo par ce que tu veux.

-- Alain.


Ca va durer des plombes si il y a des milliers de fichiers...

Je propose :

find . -type f -name 'df*' | cut -c5- | sort > tmp1
find . -type f -name "[qQ]"f* | cut -c5- | sort > tmp2
diff tmp1 tmp2 | grep '^<' | cut -c3-

te donnera les Ids concernés


ALain Montfranc
Le #117170
(supersedes
Alain Ketterlin a écrit
writes:

Le serveur est sendmail, et les mails sont rangés dans deux
fichiers, un df<id> qui correspond au corps du mail et un [qQ]f<id>
qui correspond a son etat.

Je cherche une regexp qui pourrait m'afficher tous les fichiers
df<id> qui n'ont pas de [qQ]f<id> correspondant pour les supprimer.


Quelque chose du genre (avec bash):

find . -name df*
while read F; do
if [ ! -f "[qQ]f${$F#df}" ]; then

echo "$F"
fi
done

Je te laisse remplacer echo par ce que tu veux.

-- Alain.


Ca va durer des plombes si il y a des milliers de fichiers...

Je propose :

find . -type f -name 'df*' | cut -c5- | sort > tmp1
find . -type f -name "[qQ]"f* | cut -c5- | sort > tmp2
diff tmp1 tmp2 | grep '^<' | cut -c3-

te donnera les Ids concernés

Apres pour supprimer tu peux faire :

diff tmp1 tmp2 | grep '^<' | cut -c3- | sed 's/^/df/' | xargs rm


Arnaud Giersch
Le #117169
Mercredi 14 novembre 2007, vers 10:23:25 (+0100), ALain Montfranc a
écrit:

find . -type f -name 'df*' | cut -c5- | sort > tmp1
find . -type f -name "[qQ]"f* | cut -c5- | sort > tmp2
diff tmp1 tmp2 | grep '^<' | cut -c3-


Lorsque tous les fichiers sont dans le même répertoire, on peut éviter
le double tri avec uniq :

ls | grep '^[dqQ]f' | sort -k1.3 | uniq -s3 -u

(on doit pouvoir encore l'accélérer avec l'option "--sort=none" pour
le GNU ls).

Arnaud

Jacques L'helgoualc'h
Le #117168
Le 14-11-2007, ALain Montfranc
(supersedes [...]

Je propose :

find . -type f -name 'df*' | cut -c5- | sort > tmp1
find . -type f -name "[qQ]"f* | cut -c5- | sort > tmp2
diff tmp1 tmp2 | grep '^<' | cut -c3-

te donnera les Ids concernés


Le tri de tous les fichiers, puis le diff, sont superflus ; si tous les
[dqQ]f* sont dans le même répertoire, un truc du genre (peu testé)

find . -type f -name '[dqQ]f*' | awk '{
Id=$0;
sub("^....","",Id);
if(/^./df/){
nb[Id]++;
df[Id]=$0;
}
else {
nb[Id]--;
}
}
END{
for(Id in nb){
if(nb[Id]>0){
print df[Id];
}
}
}'

devrait afficher la liste des df* privés de leur [qQ]f*. S'il y a des
sous-répertoires, on peut adapter les lignes 2 et 3 du script (GNU) Awk.

Apres pour supprimer tu peux faire :

diff tmp1 tmp2 | grep '^<' | cut -c3- | sed 's/^/df/' | xargs rm


Aaaargh ! Sed Est Di(vin|abolique), et se passe de « grep | cut | »

sed -n -e 's/^<./df/p'


--
Jacques L'helgoualc'h

Publicité
Poster une réponse
Anonyme