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 :

Est-il possible d'échapper l'argument de xargs ou l'intégrer dans une autre chaine ?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut Est-il possible d'échapper l'argument de xargs ou l'intégrer dans une autre chaine ?
    Bonjour

    J'aimerai savoir s'il est possible avec la commande xargs passer l'argument reçu au milieu de la commande qui suit. Par exemple:

    J'ai des fichiers qui contiennent des espaces, lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -1 | grep " " | xargs ls -l
    je ne trouve pas mes fichiers
    est il possible d’échapper l'argument comme de la même manière que dans la commande find -exec "{}" \; ?

    Je voudrais par exemple par la suite intégrer le l'argument dans une chaine pour faire par exemple un sed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unecommande | xargs sed'/{}/toto/g' liste.txt

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Si tu veux que la valeur prise en entrée par xargs soit prise en compte par la commande sed, il ne faut pas la protéger...
    Essaye avec unecommande | xargs sed "/{}/toto/g" liste.txt
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par cmako Voir le message
    J'aimerai savoir s'il est possible avec la commande xargs passer l'argument reçu au milieu de la commande qui suit.
    oui avec l'option -I :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type d | xargs -I{} echo "répertoire {} trouvé"
    par ailleurs l'utilisation de cette option conserve les espaces éventuels

    J'ai des fichiers qui contiennent des espaces, lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -1 | grep " " | xargs ls -l
    je ne trouve pas mes fichiers
    je sais pas si c'est juste un exemple mais si le but est de trouver tous les fichiers et répertoires qui contiennent au moins un espace c'est largement mieux (et plus simple) de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "* *" -exec ls -ld {} +

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 360
    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 360
    Par défaut
    Bonjour,

    Il y a fort à parier que la question est lié a un renommage en masse de fichier avec espace....

    Donc, si c'est le cas, voir le man de rename.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    En fait, je pose cette question, déjà pour savoir si c'est possible.
    Ensuite, je voulais effacer une liste de fichiers qui ont le noms qui commencent par un une liste venant d'un autre fichier.
    Le pb est que si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     find . -type f -name "toto.*"|xargs rm *
    si le fichier n'est pas trouvé, tout le répertoire complet est effacé

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 360
    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 360
    Par défaut
    Via une liste venant d'un fichier (appelons ce fichier fichier.txt) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xargs -a fichier.txt -IXX bash -c 'echo rm "XX"*'
    Retirer le echo si les commandes rm affichées te parait correcte.
    Après cela ne résoud pas tout, mais comme on ne connait ni ton arborescence, ni a quoi ressemble ta liste...

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par cmako Voir le message
    En fait, je pose cette question, déjà pour savoir si c'est possible.
    Ensuite, je voulais effacer une liste de fichiers qui ont le noms qui commencent par un une liste venant d'un autre fichier.
    Afin de supprimer toute ambiguïté, si tu pouvais éditer ton message pour rendre la phrase cohérente, ce serait sympa...

    Le pb est que si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     find . -type f -name "toto.*"|xargs rm *
    si le fichier n'est pas trouvé, tout le répertoire complet est effacé
    D'une part, la syntaxe n'est pas bonne. l'utilisation "correcte" serait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     find . -type f -name "toto.*"|xargs rm
    Mais d'autre part, comme indiqué par d'autres, il vaudrait mieux apprendre à utiliser l'option "-exec" de "find" (surtout que tu utilises déjà "find").

    Il faut juste savoir que ce qui suit "-exec" est une commande dans laquelle le token spécial "{}" indique le fichier trouvé par "find" et la terminaison est:
    - soit "\;" pour indiquer qu'on veut appliquer la commande sur chaque fichier (autant d'exécution de la commande que "find" a trouvé de fichiers)
    - soit "\+" pour indiquer qu'on veut appliquer la commande sur tous les fichiers (une seule exécution de la commande avec la liste de tous les fichiers trouvés par "find")

    Ici, c'est équivalent. Autant utiliser "\+":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     find . -type f -name "toto.*" -exec echo rm {} \+
    Et, si ça affiche bien ce que tu veux, tu supprimes le "echo":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     find . -type f -name "toto.*" -exec rm {} \+

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    je suis assez d'accord avec jack-ft, l'avantage du find c'est l'option -type f qui assure qu'on n'effacera que le fichier concerné s'il existe, on ne risque pas de bazarder un répertoire ou autre, même si le xargs -a plus haut me plait bien on a aucune certitude à ce niveau

    alors... en admettant qu'on ait un fichier liste qui contient 1 nom de fichier par ligne (ou début de nom de fichier), on peut peut-être envisager de faire un truc du genre find -type f -regex ".*/${fichier}.*" par exemple, et construire la regex dynamiquement, ça donnerait un truc dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -regextype posix-extended -regex "$(awk '{s=s"|.*/"$0".*"} END {print substr(s,2,1000)}' liste)" -exec ls {} \+
    j'en suis pas fier, ça me parait étrangement sale, mais je vois pas mieux pour respecter les contraintes

    Edit: un exemple de fichier liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    repertoire/fic
    un autre repertoire avec espaces/autres fich
    et la regex correspondante : .*/repertoire/fic.*|.*/un autre repertoire avec espaces/autres fich.*

  9. #9
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    Je m'en suis sorti avec un script shell, mais je voulais savoir s'il était possible de s'en sortir en une seule commande.
    J'avais un fichier avec les noms de début de fichiers comme ceci:
    Je l'ai transformé en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    find $srcDir -type f -name "abc*" exec mv {} $dstDir \;
    find $srcDir -type f -name "bcd*" exec mv {} $dstDir \;
    find $srcDir -type f -name "cde*" exec mv {} $dstDir \;

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/03/2014, 02h46
  2. Réponses: 3
    Dernier message: 05/11/2011, 11h26
  3. [POO] Est-il possible de récupérer les arguments muets d'une fonction ?
    Par RomainVALERI dans le forum Général JavaScript
    Réponses: 24
    Dernier message: 16/11/2009, 13h51
  4. Réponses: 3
    Dernier message: 13/12/2006, 16h01
  5. Réponses: 12
    Dernier message: 16/06/2006, 13h13

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