Le ls
peut donner un résultat comme
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
Mais en fait, j'espère juste découvrir CentOS-Base.repo
,CentOS-Debuginfo.repo
et CentOS-Vault.repo
non CentOS-Media.repo
. Je lance donc cette commande
ls [^\(Media\)]
Mais je reçois une information d'erreur, comment faire?
Réponses:
Dans le cas le plus simple, vous pouvez utiliser ce qui suit (dans le cas où le 1er sous-mot est statique
CentOS
):[BDV]
- classe de caractères pour garantir le deuxième sous-mot commençant par l'un des caractères spécifiésou même avec négation :
Si vous voulez ignorer tous les noms de fichiers qui contiennent le
M
caractère, avec l'implémentation GNU dels
(comme on le trouve généralement sur CentOS), utilisez l' option-I
(--ignore
):Pour ignorer les entrées contenant un
Media
mot:Ces modèles doivent être transmis textuellement à
ls
, donc doivent être cités (sinon, le shell les traiterait comme des globes à développer).la source
ls *[^M]*
?ls CentOS-[^M]*
travail, maisls *[^M]*
pas ..M
occurrence de caractère OUMedia
mot?M
.Quelques coquilles ont des opérateurs de globalisation de négation:
zsh -o extendedglob
:ksh
,zsh -o kshglob
,bash -O extglob
:bash
:ksh
:la source
Une option consiste à utiliser
find
avec les-not -name
drapeaux. C'est à direfind . -not -name CentOS-Media.repo
. Si vous ne voulez pas récapituler la structure du répertoire, ajoutez un-maxdepth 1
indicateur.Alternativement, on peut écrire ce qui suit (ce qui est beaucoup plus complexe, mais j'ai oublié le
-not
drapeau et publié cette réponse à l'origine, donc je ne supprimerai pas cette partie):find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'
Vous devez forcer la
find
séparation des noms de fichiers avec un octet nul, afin que les sauts de ligne dans les noms de fichiers ne décomposent rien. Avec un peu de chance,grep
prend en charge ce type de séparateur avec indicateur-z
. Vous voudrez peut-être revenir à la séparation typique (c.-à-d. Octet nul -> nouvelle ligne) avectr '\0' '\n'
la source
printf '%s\0' *
par des valeurs nulles qui ne récurrent pas et n'incluent pas de fichiers dot par défaut (mais certains shells ont une option pour cela). Vous n'avez pas non plus besoin-E
de cette expression rationnelle, mais pour être pointilleux, vous devez soit la barre oblique inverse, soit la.
mettre[]
, et vous dépendez de GNU find et grep.La façon la plus simple est d'utiliser find. Faire:
Ici, "f" signifie rechercher des fichiers normaux uniquement (exclut cependant les liens symboliques vers des fichiers normaux; avec GNU
find
, utilisez-xtype f
plutôt pour les inclure). Si vous souhaitez rechercher des répertoires, passez plutôt "d".(
-maxdepth
alors qu'au départ une extension GNU est maintenant assez courante. Si votrefind
ne la prend pas en charge, vous pouvez la remplacer-maxdepth 1
par la norme! -name . -prune
).voir la page de manuel find pour plus de fonctionnalités impressionnantes.
la source