[BASH] Exclure un fichier ou dossier

Résolu
Yoan Messages postés 11905 Statut Modérateur -  
 josephtux -
Bonjour,

Assez régulièrement, quand je passe des noms de fichiers ou dossiers à des commandes, j'aimerais passer comme argument "tous les fichiers, sauf un". Par exemple pour copier avec "cp" tous les fichiers d'un dossier sauf un que je spécifie manuellement.

A partir du moment où j'utilise l'étoile pour indiquer à Bash qu'il faut passer tous les fichiers et dossiers en paramètre, est-il possible d'en exclure ?

Merci
--
L'urgent est fait, l'impossible est en cours,
Pour les miracles, prévoir un délai ...

6 réponses

  1. paj
     
    il existe une solution très simple :

    Man de bash :
     If the extglob shell option is enabled using the shopt builtin, several
    extended pattern matching operators are recognized. In the following
    description, a pattern-list is a list of one or more patterns separated
    by a |. Composite patterns may be formed using one or more of the fol?
    lowing sub-patterns:

    ?(pattern-list)
    Matches zero or one occurrence of the given patterns
    *(pattern-list)
    Matches zero or more occurrences of the given patterns
    +(pattern-list)
    Matches one or more occurrences of the given patterns
    @(pattern-list)
    Matches one of the given patterns
    !(pattern-list)
    Matches anything except one of the given patterns

    donc d'abord taper
    shopt -s extglob
    pour activer ensuite on peut écrire :
    cp !(*.txt) /media/sauvegarde
    qui copiera tout sauf les fichiers .txt
    3
  2. ripat_ Messages postés 61 Statut Membre 6
     
    Directement avec la commande cp en une seule passe sans script, je ne vois pas mais par contre rsync le permet avec l'option --exclude.

    Rsync est, du reste, très utile pour la copie, synchroniqation ou mirroring.
    2
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut Yoan,

    Oui c'est clair que directement depuis la commande "cp" c'est râpé ;-((

    Après sans "rsync", il te faudra passer par des moulinettes avec soit la commande "find" et son option "-prune", soit via des pipes avec "grep -v" couplé à "xargs"...

    0
  4. Yoan Messages postés 11905 Statut Modérateur 2 356
     
    Mais c'est pas spécialement pour copier, je voudrais pouvoir exclure des fichiers à * dans le cas général :)
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Faut filtrer avec des pipes et grep -v alors (ou passer par find) ;-(
      0
    2. Yoan Messages postés 11905 Statut Modérateur 2 356
       
      OK, dommage, j'aurais voulu un symbole miracle :)

      Merci
      0
    3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Au cas ou...

      find . \( -name toto.txt -prune \) -o \( -name "*.txt" -print \)  -exec cp {} rep/ \;
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    on peut utiliser les Motifs génériques

    genre pour lister les fichiers (y compris les répertoires) du répertoire courant qui ne commence pas par q ou Q
    printf '%s\n' !([qQ]*)
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Le problème c'est que c'est bon pour exclure un caractère ou plusieurs, mais séparément (sans tenir compte de leur place dans le motif), pas pour un nom complet, ou alors en se lançant dans une regex infernale ;-((
      0
  7. Utilisateur anonyme
     
    heu, non.J'ai des fichiers log de wget, si je fais
    printf '%s\n' !(wget*)
    j'ai la liste de tous mes fichiers et répertoires sauf ceux qui commence par wget. Je pourrais exclure tous les log
    printf '%s\n' !(*log)
    les logs n'apparaissent plus, mais je vois bien mon fichier Topologie
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Ah oui ;-\

      Merci ;-))
      0
    2. josephtux
       
      et sans se lancer dans des regex infernales, on peut regrouper quelques filtres:

      printf '%s\n' !(*log|wget*)
      0