LINUX.ORG.RU

bash. Pattern matching. Одна и та же команда в терминале работает --- в сценарии нет.


0

1

Всем привет. Хочу в текущем каталоге найти все папки, являющиеся непосредственными потомками и имеющие название в форме [префикс][число]. Ручным способом решение нашёл:

dvolosnykh@xakac:/aux/vm/kvm$ bash
dvolosnykh@xakac:/aux/vm/kvm$ declare -r vmBaseName="rsoivm"
dvolosnykh@xakac:/aux/vm/kvm$ ls $vmBaseName* -d
rsoivm0  rsoivm1  rsoivm22  rsoivm33  rsoivm.cfg  rsoivm.log  rsoivmX
dvolosnykh@xakac:/aux/vm/kvm$ find $vmBaseName+([[:digit:]]) -maxdepth 0 -type d
rsoivm0
rsoivm1
rsoivm33
dvolosnykh@xakac:/aux/vm/kvm$ exit
exit
(здесь rsoivm22 --- это файл, он не нужен)

А вот сценарий выдаёт ошибку:

uninstall_aux.sh: строка 24: ошибка синтаксиса около неожиданной лексемы `('
uninstall_aux.sh: строка 24: `find $vmBaseName+([[:digit:]]) -maxdepth 0 -type d'

Вообще эту команду изначально хочется вставить в оператор $(...), чтобы сохранить результат в переменную. Но:

Bash Reference Manual

When using the $(command) form, all characters between the parentheses make up the command; none are treated specially.

С этим вроде всё понятно. А вот почему она просто, будучи самостоятельной строкой в сценарии не выполняется --- нет.

Экранирую скобки:

find $vmBaseName+\([[:digit:]]\) -maxdepth 0 -type d
find: `rsoivm+([[:digit:]])': Нет такого файла или каталога

А вот такой вариант работает, но это, конечно, не тот результат:

find $vmBaseName[[:digit:]] -maxdepth 0 -type d
rsoivm0
rsoivm1

Решение с регулярными выражениями работает, но уже просто принципиально интересно либо в чём разница, либо что я упускаю... Спасибо.

в текущем каталоге найти все папки

Достойно квотезов, ящитаю.

По теме:

vadim@host3:~/tmp$ touch bla1 bla1239 bla01
vadim@host3:~/tmp$ find . -maxdepth 1 -regex '.*bla[0-9]+'
./bla1239
./bla01
./bla1

geekless ★★
()
Ответ на: комментарий от geekless

Достойно квотезов, ящитаю.

Не понял вашей аллегории. Ну да ладно.

touch'ем вы создаёте файлы. Про регулярные выражения специально писал...

dvolosnykh
() автор топика
Ответ на: комментарий от dvolosnykh

> Не понял вашей аллегории. Ну да ладно.

Я про «папки в каталогах». Ну да ладно.

touch'ем вы создаёте файлы. Про регулярные выражения специально писал...

Я вам дал пример find-а, который находит нужную вам маску. Допишите еще -type d и что там вам еще надо, и получите профит.

geekless ★★
()
Ответ на: комментарий от geekless

Да вроде обычная синонимия. Хорошо, спасибо, я ваш пример понял.

dvolosnykh
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.