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 :

Suppression dossiers depuis membre d'un groupe


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 8
    Points
    8
    Par défaut Suppression dossiers depuis membre d'un groupe
    Bonjour,
    Nouveau sur ce forum je vous remercie d'avance pour l'aide que vous pourrez me porter.

    Problème :
    Je souhaite supprimer tous les dossiers d'un répertoire sauf ceux des membres du groupe qui ont un répertoire qui porte leur nom. Je ne souhaite pas supprimer les dossiers commun à tous.
    Comme j'ai plusieurs serveur de ce type et que les dossiers sont assez nombreux et différents en fonction des membres, je souhaite automatiser cette tache.

    Début de solution:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #!/bin/sh
     
    echo " Purge du /repertoire " && sleep 1 &&
    echo "Tapez le nom de la ville " && read ville &&
    echo "Tapez le nom du COMMUN en respectant la casse " && read commun &&
    echo "Tapez le nom d'un dossier particulier à garder (ex: gestion)" && read dossier1 &&
    echo "Tapez le nom d'un  second dossier particulier à garder (ex: scan)" && read dossier2 &&
     
    #recherche des membres du groupe et export vers ville.txt
    getent group $ville | sed -e "s/,/ \n/g" |cut -d':' -f4 > /ville.txt
     
    #ajout du commun au fichier ville.txt
    echo $commun >> /ville.txt
     
    #ajout du dossier1 au fichier ville.txt
    echo $dossier1 >> /ville.txt
     
    #ajout du dossier2 au fichier ville.txt
    echo $dossier2 >> /ville.txt
     
    #liste le nombre de ligne du fichier ville.txt
    ligne=`wc -l /$ville.txt |cut -f1 -d' '`
     
    echo " En comptant le commun et les dossiers spécifiques, voici le nombre de dossier à garder " && sleep 1 &&
    echo $ligne 
    echo " On garde les dossiers suivants" && sleep 1 &&
    cat /ville.txt
    echo " le reste on supprime " && sleep 1 &&
    ville=`cat /ville.txt`
    Je pensais donc faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /repertoire -type d -path  -name $ville -o -prune -exec rm -Rf {} ;\
    mais ça ne fonctionne pas. Il ne veut pas de ma variable.
    En gros il me manque la lecture du fichier ville.txt pour l'exclure de la recherche.
    Je me demande du coup si c'est la bonne démarche.
    Encore merci pour votre aide. (J'ajoute que je suis néophyte)

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    est-ce qu'un truc comme ça fait tes affaires (non-testé/partiellement testé uniquement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir="repertoire"
    regexp=$(awk -F':' '{gsub(/,/,"|",$4); print $4}' <<< "$(getent group ${ville})")"|${commun}|${dossier1}|${dossier2}"
    find "${dir}/" -regextype posix-awk -regex "${dir}/("${regexp}")" -exec echo "pouet: {}" \;

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 8
    Points
    8
    Par défaut
    Salut,
    Merci d'avoir pris le temps d'y réflchir.
    ta commande me renvoi :
    Syntax error: redirection unexpected
    Je suis en train de repenser le problème.
    Je n'ai pas la réponse mais est il possible de faire un truc du genre :
    Si "/repertoire/titi" = 1ligne de ville.txt alors garde
    Sinon suprime.

    Merci pour ton aide

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Citation Envoyé par BufferBob
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F':' '{gsub(/,/,"|",$4); print $4}' <<< "$(getent group ${ville})"
    ah bah non alors !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F':' '{gsub(/,/,"|",$4); print $4}' < <(getent group ${ville})
    mais ça n'a pas d'importance puisque cette syntaxe n'est pas POSIX, et shaquillou utilise /bin/sh, qui n'est pas toujours, et de moins en moins, bash.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    est-ce qu'en remplaçant par cette ligne ça fonctionne mieux ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regexp=$(echo "$(getent group ${ville})|${commun}|${dossier1}|${dossier2}" | awk -F':' '{gsub(/,/,"|",$4); print $4}')
    Citation Envoyé par shaquillou Voir le message
    Je suis en train de repenser le problème.
    Je n'ai pas la réponse mais est il possible de faire un truc du genre :
    Si "/repertoire/titi" = 1ligne de ville.txt alors garde
    Sinon suprime.
    c'est une obligation de passer par un fichier ville.txt intermédiaire ?

    sinon c'est en gros le propos du find que je t'ai donné plus haut, n'hésites pas à essayer de comprendre la commande et à l'adapter, au cas où on te servirait pas une solution toute faite 100% fonctionnelle sur un plateau

    Edit: vérifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    regexp=$(echo "$(getent group ${ville})|${commun}|${dossier1}|${dossier2}" | awk -F':' '{gsub(/,/,"|",$4); print $4}')
    find "${dir}/" -regextype posix-awk -regex "${dir}/("${regexp}")$" -a ! -path "${dir}/" -exec echo "pouet: {}" \;
    la commande affiche la liste des sous-répertoires dans le répertoire $dir dont le nom est strictement celui d'un utilisateur du groupe, et n'affiche que les répertoires de premier niveau, en prenant soin d'exclure ${dir}/ lui même.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 8
    Points
    8
    Par défaut
    Comme dit au début je suis débutant donc oui je prends le temps de comprendre la commande et l'adapter.
    Je vous remercie encore de prendre le temps de trouver une solution.

    Non il n'est pas nécessaire de passer par ville.txt.
    C'est une idée pour regrouper tous les noms de dossiers à garder mais je suis ouvert à tout autre idée.

    Ma démarche :
    Les membres ont un dossier qui leur est propre et comporte leur nom (titi a un dossier /partage/titi)
    ils ont également des dossiers qu'ils souhaitent garder (ex: /partage/commun)
    par contre tata ne fait plus parti des membres mais a gardé son dossier /partage/tata, je souhaite donc le supprimer.

    Je ne veux pas que tu penses que j'attends la réponse toute faite par contre mon niveau n'est pas très élevé.
    Merci encore

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,

    Voici un exemple qui peut t'aider si tu es sous linux:
    Ici, je montre les répertoires que j'ai dans mon arborescence, puis je montre ce que j'ai dans mon fichier "ville.txt" que je vais utiliser dans la commande suivante pour que cela affiche les répertoires de mon arborescence mais en excluant ceux qui sont dans mon fichier "ville.txt":
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    $ find  . -maxdepth 1 -type d 
    .
    ./.config
    ./.thumbnails
    ./.cache
    ./.mplayer
    ./Images
    ./.dbus
    ./.local
    ./.mozilla
    ./.hardinfo
    ./.dosbox
    ./Modèles
    ./Bibliothèque calibre
    ./.gnome2_private
    ./Vidéos
    ./.vim
    ./Téléchargements
    ./.icons
    ./Musique
    ./Public
    ./.gnome2
    ./.pki
    ./.themes
    ./locale_test
    ./.orig_vim
    ./.gconf
    ./Bureau
    ./Documents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ cat ville.txt 
    Musique
    Public
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    $ find  . -maxdepth 1 -type d | grep -v -f ville.txt | xargs -IXX echo -e "XX"
    .
    ./.config
    ./.thumbnails
    ./.cache
    ./.mplayer
    ./Images
    ./.dbus
    ./.local
    ./.mozilla
    ./.hardinfo
    ./.dosbox
    ./Modèles
    ./Bibliothèque calibre
    ./.gnome2_private
    ./Vidéos
    ./.vim
    ./Téléchargements
    ./.icons
    ./.gnome2
    ./.pki
    ./.themes
    ./locale_test
    ./.orig_vim
    ./.gconf
    ./Bureau
    ./Documents
    Cordialement.

  8. #8
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par shaquillou Voir le message
    Comme dit au début je suis débutant donc oui je prends le temps de comprendre la commande et l'adapter.
    (...)
    Je ne veux pas que tu penses que j'attends la réponse toute faite par contre mon niveau n'est pas très élevé.
    ok y'a pas de malaise, comme la commande que je te donnais n'utilisait pas de fichier intermédiaire et répondait en grande partie à ta question je me suis demandé si tu l'avais ne serait-ce qu'examiné
    anyway...

    Les membres ont un dossier qui leur est propre et comporte leur nom (titi a un dossier /partage/titi)
    ils ont également des dossiers qu'ils souhaitent garder (ex: /partage/commun)
    par contre tata ne fait plus parti des membres mais a gardé son dossier /partage/tata, je souhaite donc le supprimer.
    ok, donc en adaptant mon dernier exemple et en reprenant l'idée du -maxdepth 1 proposé par disedorgue le find devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find "${dir}/" -regextype posix-awk -maxdepth 1 ! -regex "${dir}/("${regexp}")$" ! -path "${dir}/" -exec echo "pouet: {}" \;
    le ! permet simplement la négation, reste à adapter le echo "pouet: {}" si le résultat est satisfaisant.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 8
    Points
    8
    Par défaut
    Merci !!!!!
    Grâce à vous j'ai pu réaliser ce que je souhaitais.
    Étant un peu frileux j'ai déplacé les dossiers vers un dossier "a_supprimer". J'attendrai une semaine pour supprimer le contenu.
    je passe le sujet en résolu.
    Merci encore pour les idées et la réactivité.
    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Win32/C] Savoir si un utilisateur est membre d'un groupe
    Par David.Schris dans le forum Windows
    Réponses: 3
    Dernier message: 21/09/2006, 13h15

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