négation générique [dupliquer]
Comment puis-je obtenir les résultats complémentaires d'une extension wildcard?
Si je veux lister les fichiers qui ont rocdans leurs noms, je lance
ls *roc*
mais que faire si je veux tous les fichiers qui n'ont pas rocdans le nom?
ls *[!r][!o][!c]* et ls *[!roc]*
ne fonctionnent pas. Il existe un moyen simple de faire cette expansion "opposée"?
Remarque: j'utilise bash
Réponses
Le bashshell prend en charge les modèles de globbing étendus si vous les activez avec
shopt -s extglob
Une fois activé, le modèle !(*roc*)correspondra à tout nom non caché qui ne correspond pas *roc*, c'est-à-dire à tout nom qui ne contient pas la chaîne roc.
À partir du bashmanuel:
Si l'
extgloboption shell est activée à l'aide de la fonctionshoptintégrée, plusieurs opérateurs de correspondance de modèle étendus sont reconnus. Dans la description suivante, apattern-listest une liste d'un ou plusieurs modèles séparés par un|. Les motifs composites peuvent être formés en utilisant un ou plusieurs des sous-motifs suivants:
?(pattern-list)Correspond à zéro ou une occurrence des modèles donnés
*(pattern-list)Correspond à zéro ou plusieurs occurrences des modèles donnés
+(pattern-list)Correspond à une ou plusieurs occurrences des modèles donnés
@(pattern-list)Correspond à l'un des modèles donnés
!(pattern-list)Correspond à tout sauf à l'un des modèles donnés
Remarque: ce n'est pas ce que vous demandez, juste une solution de contournement qui fournit ce que vous demandez
Habituellement, je recadre le problème et je le fais:
ls * | grep -v roc
Je préfère utiliser des outils communs (et une commande commune que j'utilise), au lieu de chercher une chose que j'utiliserai probablement une fois par an (et donc j'oublierai probablement).
Travailler avec des caractères génériques peut devenir très complexe: différents shell ont des résultats différents et peuvent donc rendre les scripts non portables.