Подтвердить что ты не робот

Список файлов, не соответствующих шаблону?

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

ls *.jar

Как перечислить дополнение шаблона? то есть все файлы, не соответствующие *.jar?

4b9b3361

Ответ 1

ls | grep -v '\.jar$'

например.

Ответ 2

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

ls !(*.jar)

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

shopt -s extglob

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

Ответ 3

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

ls !(*.jar)

Ответ 4

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

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

У этого есть некоторые причуды, но, по крайней мере, он совместим с любой оболочкой unix.

Ответ 5

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

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

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

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

Ответ 6

Одним из решений было бы ls -1|grep -v '\.jar$'

Ответ 7

И если вы хотите исключить более одного расширения файла, разделите их на канал |, например 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.

Ответ 8

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

$> ls --hide=*.jar

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

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

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

Ответ 9

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

ls -I '*.jar'