Можно ли в bash использовать подстановочные знаки для указания «все файлы в текущем каталоге, КРОМЕ [файлы, соответствующие определенному (подстановочному) шаблону]»? Например, "все файлы, которые не соответствуют * ~"

Или, в более общем смысле, возможно ли квалифицировать спецификацию файла с подстановочными символами второй, фильтрующей или отрицательной спецификацией?

2 ответа2

0

Конечно. Допустим, вы хотите, чтобы все файлы содержали строку "foo" в своем имени, но ни один из них также не содержит "bar". Так ты хочешь

foo1
foo2

Но ты не хочешь

 foobar1

Вы можете использовать простую глобализацию, чтобы сделать это так:

for f in foo!(bar)*; echo $f; done

или так

ls foo[^bar]*

Для получения дополнительной информации смотрите здесь: http://www.tldp.org/LDP/abs/html/globbingref.html Осторожно, оба метода имеют свои подводные камни. Вы, вероятно, лучше использовать find .

0

Спасибо bjanssen за то, что он указал на extglob shopt от bash, который позволяет этот вид сглаживания.

Из справочной страницы bash :

If the extglob shell option is enabled using the shopt builtin, several
extended pattern matching operators are recognized. In the following 
description, a pattern-list is a list of one or more patterns separated 
by a |.  Composite patterns may be formed using one or more of the following
sub-patterns:

          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

Итак, чтобы ответить на мой вопрос "как указать все файлы, которые не соответствуют * ~ ":

!(*~)

или без необходимости в extglob:

*[^~]

И в целом, отвечая на последнюю часть моего вопроса:

The GLOBIGNORE shell variable may be used to restrict the set of file names
matching a pattern. If GLOBIGNORE is set, each matching file name that also
matches one of the (colon-separated) patterns in GLOBIGNORE is removed from
the list of matches.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .