Как выполнить скрипт из директории с неизвестным именем

Ситуация: есть CentOS6-сервер, на котором есть директория /usr/abc, а внутри нее есть папка с именем, которое соответствует имени одного установленного пакета, например — pkg1.2.3. На этом же сервере есть другая директория /some/another/path/ и в ней тоже есть папка с именем pkg1.2.3. Внутри есть еще несколько вложенных директорий. В самом «низу» есть скрипт который надо выполнить (имя известно). В качестве параметра в этот скрипт передается путь до другой директории, часть пути которой соответствует имени другого пакета, который находится в папке /usr/def/2.2.2-1234. При этом, в /some/another/path/ находится очень много других директорий, имена которых могут быть чем-то похожи на pkg1.2.3 (pkg2.2, pkgs и т.д.), а надо взять именно ту, имя которой совпадает с /usr/abc/pkg1.2.3. Пример:

/
├── usr
│    ├── abc
│    │     └── pkg1.2.3
│    └── def
│          └── 2.2.2-1234
└── some
      └── another
             └── path
                   ├── pkg0
                   ├── pkg1.2.3
                   │      └── subdir
                   │             └── myscript.sh
                   ├── pkg2.2
                   └── pkgs

Выполнить необходимо следующее:

/some/another/path/pkg1.2.3/subdir/myscript.sh -p '/usr/def/2.2.2-1234'

Скрипт, который «делает все сам», представлен ниже:

#!/bin/sh
 
# Сохраним текущую директорию, чтоб вернуться в нее
C="$(pwd)";
 
# Быстро находим нужную "pkg1.2.3" через регулярку и сохраняем имя в J
cd /usr/abc/;
J="$(find -maxdepth 1 -type d -name 'pkg1.*' -print -quit)";
 
# Тоже самое для "2.2.2-1234" (только сохраняем в P)
cd /usr/def;
P="$(find -maxdepth 1 -type d -name '[0-9].[0-9].*' -print -quit)";
 
# Убираем "./" из J и P
J="$(sed 's/\.\///' <<<$J)";
P="$(sed 's/\.\/// ' <<<$P)";
 
# Выполняем скрипт, подставив через J и P требуемые значения
/some/another/path/$J/subdir/myscript.sh -p "$P"
 
# Возвращаемся в директорию, где были изначально
cd $C;
 
# Чистим за собой
unset C P J;

, ,

2 комментария
  1. Dark Koder Said:

    Круто)
    А в OpenBSD, FreeBSD отработает? или тест только на Линукс-ситемах был?

  2. KronuS Said:

    Dark Koder, только на CentOS проверял. Других VM нет.

Оставить комментарий

Top ↑ | Main page | Back