Forum Programmation.shell Bash: GNU find & ! -path

Posté par  (site web personnel) .
Étiquettes : aucune
0
2
juil.
2009

Bonjour,



j'ai un fichier texte dans lequel je liste tous les chemins qu'une commande find doit ignorer.


Pour l'utiliser, j'ai écrit le petit script bash suivant:


#!/bin/bash

MONFICHIER="fic.txt"

NO_PATH=""
while read item
do
NO_PATH="${NO_PATH} ! -path \"$item\""
done < <(cat ${MONFICHIER})

echo ${NO_PATH}
find $HOME -type f ${NO_PATH}


Malheureusement, si "echo" me renvoit ce que je désire, ce n'est pas le cas de la commande find: mes "! path" sont ignorés :-(.


Est-ce qu'une bonne âme aurait une idée comment remédier au problème? Est-ce qu'à tout hasard il y aurait une solution plus "élégante" (j'ai parcouru la man-page de GNU find mais n'ai pas trouvé comment injecter une liste de chemins que je ne désire pas parcourir)?

  • # Échappements ?

    Posté par  (site web personnel) . Évalué à 3.

    Il faudrait pas échapper correctement le ! ?
    En tout les cas, remplace le par un -not, c'est tout aussi lisible et ca risque pas de tomber sur ce genre de problemes.
    • [^] # Re: Échappements ?

      Posté par  (site web personnel) . Évalué à 1.

      En échappant le ! -> \!, cela n'apporte malheureusement rien :-(.

      En ce qui concerne le "-not": je ne l'avais pas utilisé en raison de la page de manuel:

      -not expr
      Same as ! expr, but not POSIX compliant.
      • [^] # Re: Échappements ?

        Posté par  . Évalué à 1.

        Bonjour,

        Pour ce qui est de l'échappement, il faut que tu mettes '\\!' et cela devrait passer.
  • # printf debugging considered harmfull

    Posté par  . Évalué à 1.

    #!/bin/bash -x
    [...]

    Comme ça tu sauras ce qui se passe vraiment. Pour tracer juste une portion de code, tu l'encadres avec des set -x et set +x. Et ça fonctionne aussi avec sh.
  • # Solution

    Posté par  . Évalué à 3.

    Première chose : faire un < <(cat ${MONFICHIER}) c'est très moche et redondant (et en plus ça ne marche que sous bash), quand il suffit de faire < ${MONFICHIER}

    Ensuite, pour ton find, ce que tu souhaites se rapproche plutôt de -prune :
    NO_PATH="$NOPATH -path \"$item\" -prune" -o
    ...
    find $HOME $NOPATH -type f -print
    J'en ai parlé dans un post sur ce forum il y a quelques jours en plus ...
    • [^] # Re: Solution

      Posté par  . Évalué à 2.

      Petite erreur : le -o est bien à l'intérieur des guillemets. C'est pour faire un ou logique, donc soit le chemin match un des paths, soit il est affiché, si c'est un fichier.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.