Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

recherche de fichiers

5 réponses
Avatar
octane
Bonjour,

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

Le serveur est sendmail, et les mails sont rang=E9s 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

5 réponses

Avatar
Alain Ketterlin
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.

Avatar
ALain Montfranc
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


Avatar
ALain Montfranc
(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


Avatar
Arnaud Giersch
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

Avatar
Jacques L'helgoualc'h
Le 14-11-2007, ALain Montfranc a écrit :
(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