web-dev-qa-db-fra.com

Liste des fichiers ne correspondant pas à un modèle?

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?

54
paislee
ls | grep -v '\.jar$'

par exemple.

53

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.

70
Christian

Règle d'expansion bash peu connue:

ls !(*.jar)
33
ccarton

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.

18
stefanct

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.

15
Dan Fego

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.

2
James Brown

Une solution serait ls -1|grep -v '\.jar$'

2
fge

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.

2
haavee

Une autre approche peut être d'utiliser ls -I flag (Ignore-pattern).

ls -I '*.jar'
1