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 POSIX Discussion :

Utilisation conjointe de xargs et rm


Sujet :

Shell et commandes POSIX

  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable Prépresse
    Inscrit en
    Août 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Prépresse
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2015
    Messages : 21
    Points : 21
    Points
    21
    Par défaut Utilisation conjointe de xargs et rm
    Bonjour,

    quelques soucis avec l'utilisation conjointe de xargs et rm.

    Je dois supprimer quelques fichiers que je trouve grace à :
    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
    iMac-Laurent:~ imaci7_1$ find "/Users/imaci7_1/Desktop/POUR TESTS AS UNIX" -name "BAT *.jpg" -or -name "BAT *.jpeg" -or -name "*.pdf" -or -name "*.png" | grep "/BAT/" | xargs -0
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/CIDRE DE GLACE/BAT/BAT ET Cidre de Glace copie.jpg
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/GLACÉ MOELLEUX DE CIDRE/BAT/BAT ET r52000_001 copie 2.jpg
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/GLACÉ MOELLEUX DE CIDRE/BAT/BAT ET r52000_001 copie.jpg
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/GLACÉ MOELLEUX DE CIDRE/BAT/BAT ET r52000_001 copie.pdf
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/GLACÉ MOELLEUX DE CIDRE/BAT/BAT ET r52000_001 copie.png
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/GLACÉ MOELLEUX DE CIDRE/LACHETEAU/dossier sans titre/BAT/ET r52000_001.pdf
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/GLACÉ MOELLEUX DE CIDRE/LACHETEAU/dossier sans titre/BAT/ET r52000_001.png
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/KERISAC/BAT/BAT ET+COL r58000_001.pdf
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/KERISAC/BAT/BAT ET+COL r58000_004.pdf
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/KERISAC/BAT/BAT ET+COL r58000_005.pdf
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/KERISAC/BAT/BAT ET+COL r58000_006.pdf
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/KERISAC/BAT/BAT ET+COL+CE r58000_007.pdf
     
    iMac-Laurent:~ imaci7_1$
    J'ai pipé xargs pour voir le résultat, vu que je découvre la commande. Apparemment je trouve bien une liste dont chaque ligne est séparée par un saut de ligne. Notez la ligne vide (14) à la fin.

    Mais, lorsque j'y ajoute rm la suppression ne fonctionne pas:
    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
    iMac-Laurent:~ imaci7_1$ find "/Users/imaci7_1/Desktop/POUR TESTS AS UNIX" -name "BAT *.jpg" -or -name "BAT *.jpeg" -or -name "*.pdf" -or -name "*.png" | grep "/BAT/" | xargs -0 rm
    rm: /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/CIDRE DE GLACE/BAT/BAT ET Cidre de Glace copie.jpg
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/CIDRE DE GLACE/BAT/BAT ET r52000_001 copie.jpg
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/GLACÉ MOELLEUX DE CIDRE/BAT/BAT ET r52000_001 copie 2.jpg
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/GLACÉ MOELLEUX DE CIDRE/BAT/BAT ET r52000_001 copie.jpg
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/GLACÉ MOELLEUX DE CIDRE/BAT/BAT ET r52000_001 copie.pdf
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/GLACÉ MOELLEUX DE CIDRE/BAT/BAT ET r52000_001 copie.png
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/GLACÉ MOELLEUX DE CIDRE/LACHETEAU/dossier sans titre/BAT/ET r52000_001.pdf
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/GLACÉ MOELLEUX DE CIDRE/LACHETEAU/dossier sans titre/BAT/ET r52000_001.png
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/KERISAC/BAT/BAT ET+COL r58000_001.pdf
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/KERISAC/BAT/BAT ET+COL r58000_004.pdf
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/KERISAC/BAT/BAT ET+COL r58000_005.pdf
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/KERISAC/BAT/BAT ET+COL r58000_006.pdf
    /Users/imaci7_1/Desktop/POUR TESTS AS UNIX/AGENCE A JETER/KERISAC/BAT/BAT ET+COL+CE r58000_007.pdf
    : File name too long
    iMac-Laurent:~ imaci7_1$
    J'ai fait un autre test en oubliant -0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    iMac-Laurent:~ imaci7_1$ find "/Users/imaci7_1/Desktop/POUR TESTS AS UNIX" -name "BAT *.jjjj" | grep "/BAT/" | xargs rm -i
    rm: /Users/imaci7_1/Desktop/POUR: No such file or directory
    rm: TESTS: No such file or directory
    rm: AS: No such file or directory
    rm: UNIX/AGENCE: No such file or directory
    rm: A: No such file or directory
    rm: JETER/GLACÉ: No such file or directory
    rm: MOELLEUX: No such file or directory
    rm: DE: No such file or directory
    rm: CIDRE/BAT/BAT: No such file or directory
    rm: ET: No such file or directory
    rm: r52000_001: No such file or directory
    rm: copie.jjjj: No such file or directory
    iMac-Laurent:~ imaci7_1$
    et là je me dis que c'est peut être un problème d'interprétation des " ", au moins dans ce dernier cas.

    Bref, je sèche.

  2. #2
    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
    Bonjour,

    la commande find n'a-t-elle pas d'option -delete sur UNIX ?

    xargs -0 serait utile avec -print0, mais ça ne résoudrait pas les problèmes liés aux espaces dans les noms des fichiers, que rm n'identifie pas.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Est-ce que la syntaxe suivante règle la question ?

    ou
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    la commande find n'a-t-elle pas d'option -delete sur UNIX ?
    Pas forcément, "-delete" n'est pas POSIX.

    xargs -0 serait utile avec -print0, mais ça ne résoudrait pas les problèmes liés aux espaces dans les noms des fichiers, que rm n'identifie pas.
    "xargs -0" et "print0" ne sont pas POSIX non plus.


    Voici une méthode portable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find "/Users/imaci7_1/Desktop/POUR TESTS AS UNIX" -name "BAT *.jpg" -o -name "BAT *.jpeg" -o -name "*.pdf" -o -name "*.png" -exec \
        sh -c 'for file do case "$file" in (*/BAT/*) ;; (*) rm "$file";; esac; done' sh {} +
    ɹǝsn *sıɹɐlos*

  5. #5
    Membre à l'essai
    Homme Profil pro
    Responsable Prépresse
    Inscrit en
    Août 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Prépresse
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2015
    Messages : 21
    Points : 21
    Points
    21
    Par défaut Pfff !!!
    Merci pour vos réponses.

    J'ai bien vu une option -delete pour find, mais ma recherche porte sur des fichiers bien précis (ok pour find dans ce cas) se trouvant dans les répertoires BAT (de ce que j'ai compris, je peux chercher des noms de fichiers mais pas des chemins avec find) d'où le pipe de grep.

    Je n'ai pas encore eu le temps de tester vos deux dernières réponses, mais je dois avouer que je ne les comprends pas.

    Je manque de formation sur Unix, pouvez vous me conseiller un cours, si possible en Français, qui pourra m'amener à la compréhension (puis l'écriture) de vos réponses ? Je suis conscient que cela ne se fera pas en quelques jours.
    Je suis responsable prépresse dans une imprimerie. Mes besoins de "base" sont en gros :
    trouver des fichiers, en supprimer, en déplacer, en renommer.

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par hopus Voir le message
    J'ai bien vu une option -delete pour find, mais ma recherche porte sur des fichiers bien précis (ok pour find dans ce cas) se trouvant dans les répertoires BAT (de ce que j'ai compris, je peux chercher des noms de fichiers mais pas des chemins avec find) d'où le pipe de grep.
    Ooops, j'avais compris le contraire.

    Voici ma solution corrigée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find "/Users/imaci7_1/Desktop/POUR TESTS AS UNIX" -name "BAT *.jpg" -o -name "BAT *.jpeg" -o -name "*.pdf" -o -name "*.png" -exec \
        sh -c 'for file do case "$file" in (*/BAT/*) rm "$file";; esac; done' sh {} +
    ɹǝsn *sıɹɐlos*

  7. #7
    Membre à l'essai
    Homme Profil pro
    Responsable Prépresse
    Inscrit en
    Août 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Prépresse
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2015
    Messages : 21
    Points : 21
    Points
    21
    Par défaut
    J'ai cru apercevoir du coin de l'oeil quelques fichiers disparaître, mais pas sûr.
    J'ai travaillé sur un autre dossier test plus simple mais rien ne se produit.

  8. #8
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Ah oui, un problème de précédence de booléens, il faut grouper les "-name":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find "/Users/imaci7_1/Desktop/POUR TESTS AS UNIX" \( -name "BAT *.jpg" -o -name "BAT *.jpeg" -o -name "*.pdf" -o -name "*.png" \) -exec \
        sh -c 'for file do case "$file" in (*/BAT/*) rm "$file";; esac; done' sh {} +
    ɹǝsn *sıɹɐlos*

  9. #9
    Membre à l'essai
    Homme Profil pro
    Responsable Prépresse
    Inscrit en
    Août 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Prépresse
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2015
    Messages : 21
    Points : 21
    Points
    21
    Par défaut
    Chapeau bas ! Merci beaucoup.
    Ça à l'air de bien fonctionner et vite.

    Je ferai plus de tests la semaine prochaine afin de valider le fonctionnement.

    Cela t'ennuierait de me commenter ta ligne de commande s'il te plaît ?
    Et si quelqu'un peut me renseigner à propos des cours à suivre pour arriver à ce genre de résultats.

    Bon week end.

  10. #10
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Voici une explication de la partie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -exec sh -c 'for file do case "$file" in (*/BAT/*) rm "$file";; esac; done' sh {} +
    1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -exec sh -c "xxxx" sh {} +
    execute (sh -c) le code shell ("xxxx") en lui passant en paramètre les fichiers sélectionnés par find ({}). S'il y a trop de fichiers, découpe la liste de fichier et lance plusieurs fois la commande, comme l'aurait fait xargs, c'est le + à la fin du find qui fait ça, sinon, on aurait mis \; mais ça aurait été moins rapide.

    2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for file do case "$file" in (*/BAT/*) rm "$file";; esac; done
    est équivalent à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for file in "$@"; do # Pour chaque fichier passé en paramètre, le "$@" permet de préserver les espaces dans les paramètres, je ne l'ai pas mis car c'est de toute façon ce que fait for par défaut
        case "$file" in               # tester le nom du fichier (le chemin est inclus)
            (*/BAT/*) rm "$file";;  # s'il contient "/BAT/", on efface le fichier
        esac
    done
    ɹǝsn *sıɹɐlos*

  11. #11
    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,

    Moi, ce que je ne comprends dans le -exec sh -c "xxx" sh {} +, c'est le deuxième sh, il sert à quoi ?
    Cordialement.

  12. #12
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Il ne sert pas à grand chose mais il faut quand même mettre quelque chose à cet endroit là, j'aurais pu mettre toto à la place sans changement fonctionnel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -exec sh -c "xxx" toto {} +
    Ce paramètre sert uniquement à affecter $0, ce qui est indispensable pour le bon fonctionnement de la boucle car sinon, on oublierait au moins un fichier, mais sinon, on ne se sert pas de $0 dans le script.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    man ksh:
    
           -c        If the -c option is present, then commands are read from the first arg.  Any remaining arguments become positional parameters starting at 0.
    
    man bash:
    
           -c        If the -c option is present, then commands are read from the first non-option argument command_string.  If there are arguments after the command_string, they are assigned to the positional parameters, starting with $0.
    
           -c chaîne Si l'argument -c est présent, les commandes sont interprétées depuis la chaîne  fournie.  S'il  existe  d'autres  arguments après la chaîne, ils sont transmis comme paramètres positionnels, en commençant par $0.
    ɹǝsn *sıɹɐlos*

  13. #13
    Membre à l'essai
    Homme Profil pro
    Responsable Prépresse
    Inscrit en
    Août 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Prépresse
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2015
    Messages : 21
    Points : 21
    Points
    21
    Par défaut Puissant !
    Ça marche très bien. Je l'ai testé sur quelques dossiers ; un à la fois par précaution. Le script se comporte comme attendu.

    Un grand merci pour m'avoir dépanné et aussi pour les explications. Bravo.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/05/2010, 21h52
  2. Réponses: 3
    Dernier message: 19/05/2008, 12h52
  3. utiliser ls et xargs pour déplacer des fichiers
    Par walrus_55 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 06/04/2007, 10h22
  4. utiliser conjointement JML et Generics
    Par goldorax113 dans le forum Langage
    Réponses: 2
    Dernier message: 21/10/2006, 00h40
  5. [PEAR][HTML_QuickForm] Utilisation conjointe des packages QuickForm et Table
    Par Vrylx dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 30/09/2006, 20h52

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