Я пытаюсь сопоставить эти имена файлов с помощью команды find:
4702011-10-21CR719557-R85262-ALPHA.jar
4702011-10-21CR719557-R85262-BETA.jar
Я неплохо знаком с синтаксисом регулярных выражений Java-Perl. К сожалению, find поддерживает только синтаксис emacs и posix.
Даже посмотрев синтаксис emacs, я не могу найти базовое совпадение для работы.
find . -regex "^[[:digit:]]+" -- matches nothing
find . -regex "^[[:digit:]]+.*(ALPHA\|BETA)\.jar" -- matches nothing
Это довольно просто на Java и Perl, например:
ls | grep -P "^\d+.*(ALPHA|BETA)\.jar"
работает.
Регулярное выражение, использующее стиль emacs для соответствия вашему шаблону, может быть:
".*/[0-9]+-[0-9]+-[0-9A-Z]+-[0-9A-Z]+-\(ALPHA\|BETA\)\.jar$"
Вот простой тест, который я сделал:
abarbosa@SPF-157:~/Temp/test$ ls -1
4702011-10-21CR719557-R85262-ALPHA.jar
4702011-10-21CR719557-R85262-BETA.jar
whatever.jar
abarbosa@SPF-157:~/Temp/test$ find . -regex ".*/[0-9]+-[0-9]+-[0-9A-Z]+-[0-9A-Z]+-\(ALPHA\|BETA\)\.jar$"
./4702011-10-21CR719557-R85262-BETA.jar
./4702011-10-21CR719557-R85262-ALPHA.jar
регулярное выражение для сопоставления этих файлов с posix-awk или posix-extended regxtype будет:
find . -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
потому что find -regex соответствует, а не ищет
вы можете указать тип регулярного выражения с помощью -regextype. см. справочную страницу своей реализации find, чтобы проверить, какие механизмы регулярных выражений поддерживаются.
образец (получить файлы независимо от глубины каталога):
root@smgw:/tmp# ls -1
4702011-10-21CR719557-R85262-ALPHA.jar
4702011-10-21CR719557-R85262-BETA.jar
one
root@smgw:/tmp# find . -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
./4702011-10-21CR719557-R85262-ALPHA.jar
./4702011-10-21CR719557-R85262-BETA.jar
переместите банки, убедитесь, что они все еще возвращены
искать их с помощью абс
root@smgw:/tmp# find /tmp -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
/tmp/4702011-10-21CR719557-R85262-ALPHA.jar
/tmp/4702011-10-21CR719557-R85262-BETA.jar
измененная глубина:
root@smgw:/tmp# mkdir -p x/y/z
root@smgw:/tmp# cp *^C
root@smgw:/tmp# mv *.jar x/y/z/
root@smgw:/tmp# find /tmp -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
/tmp/x/y/z/4702011-10-21CR719557-R85262-ALPHA.jar
/tmp/x/y/z/4702011-10-21CR719557-R85262-BETA.jar
Согласно man find
, это матч на весь путь, а не поиск. Итак, вы должны использовать что-то вроде этого:
$ find . -regex .*/[0-9]+.*\.jar
Вы также можете изменить тип регулярного выражения на posix-awk, posix-basic, posix-extended, ... с помощью -regextype
вариант.