Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/07/2011, à 10:02

iuchiban

Utiliser une chaine générée comme paramètre d'un find

Salut tout le monde,

Je suis en train de faire un script qui nettoie les répertoires de logs des applis au boulot.

Actuellement, je fais un

find ${_REP}/logs/ \( -name \*log\* -o -name \*txt\* -o -name \*zip\* -o -name \*gz\* \) -type f -mtime +30 -exec rm {} \; 2>/dev/null

Mais je voudrais pouvoir paramétrer la chaîne de recherche de noms.

Avec ce bout de code, je génère une chaine "-name \*typ1\* -o ... -name \*typN\*"

#!/bin/bash
set -x

_T="txt sh"
_C=""
for _S in ${_T}
do
  _C=$(echo ${_C}"-name \*${_S}\* -o ")
done
echo ${_C%-*}
find . \( ${_C%-*} \)

Mais le find ajoute des ' devant mes \ lors de l'évaluation de la chaîne :

$ ./Test.sh
+ _T='txt sh'
+ _C=
+ for _S in '${_T}'
++ echo '-name \*txt\* -o '
+ _C='-name \*txt\* -o '
+ for _S in '${_T}'
++ echo -name '\*txt\*' -o '-name \*sh\* -o '
+ _C='-name \*txt\* -o -name \*sh\* -o '
+ echo -name '\*txt\*' -o -name '\*sh\*'
-name \*txt\* -o -name \*sh\* <= La chaîne telle que je la veux
+ find . '(' -name '\*txt\*' -o -name '\*sh\*' ')'

Une idée pour ce problème ?


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#2 Le 26/07/2011, à 12:18

AnsuzPeorth

Re : Utiliser une chaine générée comme paramètre d'un find

Bjr,
Une autre solution, en passant que par des variables:

t=txt
s=sh
regex="\($t\|$s\)"
find . -type f -regex ".*\.$regex" -delete

Dernière modification par AnsuzPeorth (Le 26/07/2011, à 12:20)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#3 Le 26/07/2011, à 12:34

FRUiT

Re : Utiliser une chaine générée comme paramètre d'un find

#!/bin/sh

_T="txt zip"

for _S in $_T; do _C="${_C}${_C:+"\|"}.*${_S}"; done

find ${_REP}/logs/ -regex "${_C}"

[EDIT] Arf grillé !

Dernière modification par FRUiT (Le 26/07/2011, à 12:39)


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#4 Le 26/07/2011, à 12:55

AnsuzPeorth

Re : Utiliser une chaine générée comme paramètre d'un find

FRUiT a écrit :

[EDIT] Arf grillé !

Vi, mais moi j'ai juste proposé une ossature, toi tu as proposé LA solution au problème donné smile

Dernière modification par AnsuzPeorth (Le 26/07/2011, à 12:55)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#5 Le 26/07/2011, à 14:43

iuchiban

Re : Utiliser une chaine générée comme paramètre d'un find

@FRUiT : en standard, ton astuce ne fonctionnait pas sur mon serveur.
Mais en changeant l'option regextype en egrep, et en modifiant le format de la regex :

_T="txt sh"
_C=""
for _S in ${_T}
do
  _C="${_C}${_C:+"\|"}${_S}"
done
echo ${_C}
find . -regextype egrep -regex .*\(${_C}\).*

J'ai bien tous mes fichiers txt et sh qui ressortent.

Je peux changer mes types en mettant sh$ pour ne pas sortir les .sh.sav par exemple.

Merci les gars smile


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne