Список файлов, не соответствующих шаблону? - PullRequest
54 голосов
/ 15 декабря 2011

Вот как можно перечислить все файлы, соответствующие шаблону, в bash:

ls *.jar

Как вывести список дополнения шаблона?т.е. все файлы не совпадают * .jar?

Ответы [ 9 ]

69 голосов
/ 04 сентября 2012

Использовать расширенное сопоставление с образцом в стиле egrep.

ls !(*.jar)

Это доступно, начиная с bash-2.02-alpha1.Сначала необходимо включить с помощью

shopt -s extglob

Начиная с bash-4.1-alpha, есть опция конфигурации, позволяющая включить это по умолчанию.

53 голосов
/ 15 декабря 2011
ls | grep -v '\.jar$'

например.

33 голосов
/ 15 декабря 2011

Малоизвестное правило расширения bash:

ls !(*.jar)
17 голосов
/ 13 сентября 2014

POSIX определяет несоответствующие выражения в скобках, поэтому мы можем позволить оболочке расширять имена файлов для нас.

ls *[!j][!a][!r]

Это имеет некоторые причуды, но, по крайней мере, оно совместимо с любой оболочкой Unix.

15 голосов
/ 15 декабря 2011

С соответствующей версией find вы можете сделать что-то подобное, но это немного излишне:

find . -maxdepth 1 ! -name '*.jar'

find находит файлы. Аргумент . указывает, что вы хотите начать поиск с ., то есть с текущего каталога. -maxdepth 1 говорит, что вы хотите искать только на один уровень, то есть в текущем каталоге. ! -name '*.jar' ищет все файлы, которые не соответствуют регулярному выражению *.jar.

Как я уже сказал, для этого приложения это немного излишне, но если вы удалите -maxdepth 1, вы сможете затем рекурсивно искать все файлы, не являющиеся файлами jar, или что у вас легко.

2 голосов
/ 06 сентября 2018

Если ваш ls поддерживает это (man ls), используйте опцию --hide=<PATTERN>.В вашем случае:

$> ls --hide=*.jar

Нет необходимости анализировать вывод ls (потому что это очень плохо), и он масштабируется, чтобы не отображать файлы нескольких типов.В какой-то момент мне нужно было увидеть, какие не исходные, необъектные, не сгенерированные libtool файлы находились в (загроможденном) каталоге:

$> ls src --hide=*.{lo,c,h,o}

Работало как шарм.

2 голосов
/ 15 августа 2017

И если вы хотите исключить более одного расширения файла, разделите их с помощью канала |, например ls test/!(*.jar|*.bar). Давайте попробуем это:

$ mkdir test
$ touch test/1.jar test/1.bar test/1.foo
$ ls test/!(*.jar|*.bar)
test/1.foo

Глядя на другие ответы, вам сначала может понадобиться shopt -s extglob.

2 голосов
/ 15 декабря 2011

Одно решение будет ls -1|grep -v '\.jar$'

0 голосов
/ 28 мая 2019

Другим подходом может быть использование флага ls -I (Ignore-pattern).

ls -I '*.jar'
...