[BASH] Exclure un fichier ou dossier
Résolu
Yoan
Messages postés
11905
Statut
Modérateur
-
josephtux -
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 ...
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
-
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 tapershopt -s extglob
pour activer ensuite on peut écrire :cp !(*.txt) /media/sauvegarde
qui copiera tout sauf les fichiers .txt -
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. -
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"...
-
Mais c'est pas spécialement pour copier, je voudrais pouvoir exclure des fichiers à * dans le cas général :)
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 Qprintf '%s\n' !([qQ]*)
-
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 logprintf '%s\n' !(*log)
les logs n'apparaissent plus, mais je vois bien mon fichier Topologie