Вот как можно перечислить все файлы, соответствующие шаблону в bash:
ls *.jar
Как составить список дополнений узора? т.е. все файлы, не соответствующие * .jar?
Вот как можно перечислить все файлы, соответствующие шаблону в bash:
ls *.jar
Как составить список дополнений узора? т.е. все файлы, не соответствующие * .jar?
ls | grep -v '\.jar$'
например.
ls | grep -v -e '\.one$' -e '\.two$'
.
- person Michael Krelin - hacker; 29.11.2012
ls
, спасибо.
- person gniourf_gniourf; 06.05.2014
Используйте расширенное сопоставление с образцом в стиле egrep.
ls !(*.jar)
Это доступно, начиная с bash-2.02-alpha1. Сначала необходимо включить с помощью
shopt -s extglob
Начиная с bash-4.1-alpha, есть опция конфигурации, позволяющая включить это по умолчанию.
Малоизвестное правило расширения bash:
ls !(*.jar)
POSIX определяет неподходящие выражения в квадратных скобках, поэтому мы можем позволить оболочке расширять имена файлов за нас.
ls *[!j][!a][!r]
У этого есть некоторые причуды, но, по крайней мере, он совместим с любой оболочкой unix.
С подходящей версией find
вы могли бы сделать что-то вроде этого, но это немного перебор:
find . -maxdepth 1 ! -name '*.jar'
find
находит файлы. Аргумент .
указывает, что вы хотите начать поиск с .
, то есть с текущего каталога. -maxdepth 1
сообщает ему, что вы хотите искать только на один уровень в глубину, то есть в текущем каталоге. ! -name '*.jar'
ищет все файлы, которые не соответствуют регулярному выражению *.jar
.
Как я уже сказал, это немного излишне для этого приложения, но если вы удалите -maxdepth 1
, вы можете легко рекурсивно искать все файлы, отличные от jar, или то, что у вас есть.
Если ваш ls
поддерживает это (man ls
), используйте параметр --hide=<PATTERN>
. В твоем случае:
$> ls --hide=*.jar
Нет необходимости анализировать вывод ls
(потому что он очень плохой), и он масштабируется, чтобы не отображать несколько типов файлов. В какой-то момент мне нужно было увидеть, какие файлы, не являющиеся исходными, не объектными и не-libtool, находятся в (загроможденном) каталоге:
$> ls src --hide=*.{lo,c,h,o}
Работал как шарм.
Другой подход может заключаться в использовании флага ls -I
(шаблон игнорирования).
ls -I '*.jar'
А если вы хотите исключить более одного расширения файла, разделите их вертикальной чертой |
, например 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
.
!(*.[bj]ar)
.
- person Benjamin W.; 31.01.2018
Одно из решений было бы ls -1|grep -v '\.jar$'
ls
, спасибо.
- person gniourf_gniourf; 06.05.2014
ls
или использование goto
. Иногда эти решения работают лучше всего.
- person Jonathan Landrum; 24.07.2014
find . -print0 | grep -z '\.jar$'
работает лучше, даже если вы не хотите использовать --ignore
или расширенную подстановку Bash. Тем не менее, большинство людей не хотят читать всю статью, чтобы понять правило или то, что им следует делать, и вы можете подобрать простое объяснение и рекомендацию типа «это не работает в крайних случаях». ; используйте вместо них find -print0
и grep -z
»в комментарии.
- person Daniel H; 07.01.2017
Некоторые упомянутые варианты этой формы:
ls -d *.[!j][!a][!r]
Но, похоже, это работает только с bash, в то время как это работает как с bash, так и с zsh:
ls -d *.[^j][^a][^r]