Назад | Перейти на главную страницу

Как мне найти эту строку?

Я пытаюсь сопоставить эти имена файлов с помощью команды 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 вариант.