négation générique [dupliquer]

Sep 30 2020

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

3 Kusalananda Sep 30 2020 at 16:52

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 fonction shoptintégrée, plusieurs opérateurs de correspondance de modèle étendus sont reconnus. Dans la description suivante, a pattern-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

1 GiacomoCatenazzi Sep 30 2020 at 16:48

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.