Voici comment répertorier tous les fichiers correspondant à un modèle dans bash:
ls *.jar
Comment lister le complément d'un motif? c'est-à-dire que tous les fichiers ne correspondent pas à * .jar?
ls | grep -v '\.jar$'
par exemple.
Utilisez la correspondance de motifs étendue de style egrep.
ls !(*.jar)
Il est disponible à partir de bash-2.02-alpha1. Doit d'abord être activé avec
shopt -s extglob
Depuis bash-4.1-alpha, il existe une option de configuration pour l'activer par défaut.
Règle d'expansion bash peu connue:
ls !(*.jar)
POSIX définit des expressions de parenthèses qui ne correspondent pas, nous pouvons donc laisser le Shell développer les noms de fichiers pour nous.
ls *[!j][!a][!r]
Cela a cependant quelques bizarreries, mais au moins il est compatible avec à peu près n'importe quel shell Unix.
Avec une version appropriée de find
, vous pourriez faire quelque chose comme ça, mais c'est un peu exagéré:
find . -maxdepth 1 ! -name '*.jar'
find
recherche des fichiers. Le .
l'argument indique que vous souhaitez commencer la recherche à partir de .
, c'est-à-dire le répertoire courant. -maxdepth 1
lui indique que vous ne souhaitez rechercher qu'un niveau en profondeur, c'est-à-dire le répertoire actuel. ! -name '*.jar'
recherche tous les fichiers qui ne correspondent pas correspondent à l'expression régulière *.jar
.
Comme je l'ai dit, c'est un peu exagéré pour cette application, mais si vous supprimez le -maxdepth 1
, vous pouvez ensuite rechercher récursivement tous les fichiers non-jar ou ce que vous avez facilement.
Et si vous souhaitez exclure plusieurs extensions de fichier, séparez-les avec un tube |
, Comme ls test/!(*.jar|*.bar)
. Essayons:
$ mkdir test
$ touch test/1.jar test/1.bar test/1.foo
$ ls test/!(*.jar|*.bar)
test/1.foo
En regardant les autres réponses, vous devrez peut-être shopt -s extglob
D'abord.
Une solution serait ls -1|grep -v '\.jar$'
Si votre ls
le prend en charge (man ls
) Utilisez le --hide=<PATTERN>
option. Dans ton cas:
$> ls --hide=*.jar
Pas besoin d'analyser la sortie de ls
(car c'est très mauvais) et il évolue pour ne pas montrer plusieurs types de fichiers. À un moment donné, j'avais besoin de voir quels fichiers générés non source, non objet, non libtool étaient dans un répertoire (encombré):
$> ls src --hide=*.{lo,c,h,o}
A fonctionné comme un charme.
Une autre approche peut être d'utiliser ls -I
flag (Ignore-pattern).
ls -I '*.jar'