У меня есть две папки, CA01
и CA02
в текущей папке foo
:
foo -+
|
+-CA01
|
+-CA02
Когда я печатаю
find . -regex ".*CA[0-9]+" -exec echo {} +
Или
find . -regex ".*CA[0-9][0-9]" -exec echo {} +
У меня получился следующий результат, как и ожидалось:
./CA01 ./CA02
Но когда я печатаю
find . -regex ".*CA[0-9]\{2\}" -exec echo {} +
Ничего не появляется, что весьма неожиданно.
Потому что по умолчанию find
используется emacs regex. Я мог бы использовать все вышеперечисленное, чтобы сопоставить две папки.
Я что-то упустил?
решение1
Вам нужно изменить -regextype
на тот, который поддерживает подсчет повторений (т.е. {2}
). Тип по умолчанию, emacs
похоже, не поддерживает подсчеты. Тип регулярного выражения по умолчанию имитирует старую версию Emacs, в которой не было синтаксиса для подсчета повторений. Типы ниже, похоже, работают для меня.
Примеры
posix-egrep
$ find foo -regextype posix-egrep -regex ".*CA[0-9]{2}" -exec echo {} +
foo/CA02 foo/CA01
сед
$ find foo -regextype sed -regex ".*CA[0-9]\{2\}" -exec echo {} +
foo/CA02 foo/CA01
posix-расширенный
$ find foo -regextype posix-extended -regex ".*CA[0-9]{2}" -exec echo {} +
foo/CA02 foo/CA01
Есть и другие, но я больше не пробовал. Смотрите find
страницу man и ищите -regextype
.
выдержка
-regextype type
Changes the regular expression syntax understood by -regex and
-iregex tests which occur later on the command line. Currently
implemented types are emacs (this is the default), posix-awk,
posix-basic, posix-egrep and posix-extended.
Моя версия находки
$ find -version
find (GNU findutils) 4.5.9
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version 1778ee9e7d0e150a37db66a0e51c1a56755aab4f
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)