IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Exclusion répertoire valeur tableau


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut Exclusion répertoire valeur tableau
    Bonjour à tous !

    Je suis coincé et en cherchant sur différents sites j'ai les réponses mais ne comprend pas pourquoi cela ne fonctionne pas. Je cherche à exclure des répertoires avec ces 2 lignes de codes ci-dessous qui fonctionnent à merveille.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sources=( "/machin/data/outsftp/user-oasis" "/machin/data/outsftp/user-atams" )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exclusion=$(find $dir -type d \( -path ${sources[0]} -o -path ${sources[1]} \) -prune -o -print)
    Maintenant je veux optimiser et donc regrouper les valeurs de la variable "sources" (à l'avenir il se peut que je puisse rajouter des valeurs dans "sources" et plutôt que de rajouter dans "exclusion" ${sources[2]} ${sources[3]} etc) dans celle de "exclusion" j'utilise $"{sources[@]} mais en faisant comme ci-dessous je n'ai plus le même résultat voire cela ne fonctionne plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exclusion=$(find $dir -type d \( -path $"{sources[@]}" \) -prune -o -print)
    J'ai beau cherché partout sur différentes forums Internet mais cela n'aboutit plus.

    Est ce faisable ? si oui Comment faudrait il y parvenir ? ou dois je bien décomposer la ligne de code comme indiqué tout en haut ?

    Par avance merci pour vos conseils

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    -path ne prend qu'un seul argument.

    PS : c'est une erreur de copie $"{ar[@]} au lieu de "${ar[@]}" ?
    PS2 : mettre le résultat d'un find dans une variable plate n'est pas une bonne idée, et mettre une simple substitution de commande dans un tableau aura les mêmes effets potentiellement "pervers"
    comme déjà dit, la réutilisation de la sortie de find doit être pratiquée à partir de -print0.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    exclude_list=("/machin/data/outsftp/user-oasis" "/machin/data/outsftp/user-atams")
    exclude_args=()
     
    for path in "${exclude_list[@]}"; do
      exclude_args+=("-not" "-path" "$path")
    done
     
    find $dir -type d "${exclude_args[@]}"
    Ca ne fonctionnerait pas ça ?

    Perso, ça, ça passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    exclude_list=("./A ranger/*" "./En cours/*")
    exclude_args=()
     
    for path in "${exclude_list[@]}"; do
      exclude_args+=("-not" "-path" "$path")
    done
     
    find . -type f "${exclude_args[@]}"
    Et si on veut utiliser -prune (qui est plus pratique), chatGPT propose (après plusieurs essais et correction) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    exclude_list=("/machin/data/outsftp/user-oasis" "/machin/data/outsftp/user-atams")
    exclude_args=()
     
    for path in "${exclude_list[@]}"; do
      exclude_args+=("-o" "-path" "$path")
    done
     
    find $dir \( "${exclude_args[@]:1}" \) -prune -o -type d -print
    ${exclude_args[@]:1} permet de virer le 1er -o

    et pour éviter bien des soucis et utiliser print0 comme conseillé par N_Bah :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mapfile -td '' exclusion < <(find $dir \( "${exclude_args[@]}" \) -o -type d -print0)

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sources=( "/machin/data/foo  outsftp/user-oasis" "/machin/data/bar outsftp/user-atams" )
    $ bob=( "${sources[@]@Q}" )
    $ bob=( "${bob[@]/#/-not -path }" )
    $ echo "${bob[@]}"
    -not -path '/machin/data/foo  outsftp/user-oasis' -not -path '/machin/data/bar outsftp/user-atams'

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    J'avais essayé des trucs comme ça au début mais sans que ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    sources=( "./Nouveau dossier" "./A ranger" )
    bob=( "${sources[@]@Q}" )
    bob=( "${bob[@]/#/-not -path }" )
    echo "${bob[@]}"
    -not -path './Nouveau dossier' -not -path './A ranger'
     
    find . -type f ${bob[@]}
    find: paths must precede expression: `dossier''
     
    find . -type f "${bob[@]}"
    find: prédicat inconnu «*-not -path './Nouveau dossier'*»
     
    find . -type f "${bob[*]}"
    find: prédicat inconnu «*-not -path './Nouveau dossier' -not -path './A ranger'*»
     
    find . -type f ${bob[*]}
    find: paths must precede expression: `dossier''
    Par contre c'est quoi ce @Q dans ${sources[@]@Q} ?!

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    On peut simplifier avec une seule ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IFSbob=( ${sources[@]/#/-notø-pathø} )
    Pas besoin, a priori, du @Q ( en bash, c'est un operator sur paramètre qui sert à quoter une chaine, voir le § Parameter expansion dans le man)
    Sinon, ici j'utilise ø comme IFS car très peu de chance de le rencontrer dans un nom de fichier ( A part chez N_BaH )
    Et ici, je ne protège pas la variable sources car on est dans un cas ou il ne faut pas le faire

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/01/2013, 16h00
  2. Récupérer valeur tableau crée par vba
    Par Pago dans le forum VBA Access
    Réponses: 4
    Dernier message: 03/05/2010, 22h10
  3. Problème valeur tableau
    Par sepnar dans le forum C
    Réponses: 5
    Dernier message: 15/02/2010, 11h20
  4. Réponses: 7
    Dernier message: 03/05/2008, 00h40
  5. [Tableaux] Lecture répertoire + remplir tableau
    Par Guiona dans le forum Langage
    Réponses: 1
    Dernier message: 19/01/2007, 09h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo