Réponses:
Utilisez l'option de ligne de commande -v
ou --invert-match
,
ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$
grep -v
ou
grep --invert-match
Vous pouvez également faire la même chose en utilisant find
:
find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)
Plus d'infos ici .
find
commande est la solution la plus sémantique à ce problème XY. La combinaison ls
et grep
à cette fin semble au mieux hacky. Ce devrait être la réponse acceptée. (+1)
Ajoutez l' -v
option à votre grep
commande pour inverser les résultats.
grep "subscription" | grep -v "spec"
Comme indiqué plusieurs fois, l'inversion est obtenue par l' -v
option to grep
. Permettez-moi d'ajouter la note (j'espère amusante) que vous auriez pu comprendre cela vous-même en parcourant le grep
texte d'aide:
grep --help | grep invert
-v, --invert-match sélectionner les lignes non correspondantes
-v
/--invert-match
ne retournera pas nécessairement si le code de retourgrep
indique une exécution réussie, mais correspondra plutôt aux lignes qui autrement ne seraient pas mises en correspondance. Ceux qui cherchent à inverser le code retour (c'est-à-dire réussir si toutes les lignes ne correspondent pas au modèle, plutôt qu'au moins un) devraient utiliser! grep
. Ceci trouve utilisation dans des expressions conditionnelles, par exemple:if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi
.