Хороший день,
Я попытался решить эту проблему все утро, но не имел успеха. Я хотел бы искать определенные сценарии в конкретной папке и выполнить их всех параллельно. Сценарии имеют различные имена, но весь конец с "run.sh". Ниже того, что я попробовал без успеха.
Первый подход должен был использовать, находят в сочетании с-execdir. Это работает, однако, сценарии выполняются последовательным способом. Я хочу, чтобы все сценарии были выполнены, одновременно параллельны). Кажется, нет никакой опции достигнуть этого с-execdir
find . -name "*run.sh" -type f -execdir 'nohup' {} '&' \;
Затем я пытался использовать xargs, потому что существует, имеет параллельную опцию (-P). Я еще не попробовал параллельную опцию, потому что я не могу заставить xargs запускать скрипты в их соответствующих подпапках. Команды ниже выполняют все сценарии, но делают это в папке, в которой я выполняю команду, поэтому сами сценарии не работают. Сценарии должны быть выполнены в их собственных подпапках. В вышеупомянутом примере-execdir делает это в противоположность - должностное лицо. Как я достигаю этого с xargs?
nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c f\ \{\}
или
nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c "f {}"
или
nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c "./{}"
Я действительно расстроен и надеюсь, что существует кто-то там, который может помочь. Огромное спасибо!
На основе ответа Чоробы:
find . -iname '*run.sh' -printf 'cd %h; ./%f\0' | xargs -L1 -0 -P0 bash -c
Вы можете использовать -printf
для создания командной строки. % h
- это каталог, в котором находится файл, а % f
- это имя файла без пути (базовое имя). Параметр -P
включает параллелизм в xargs
, а -L1 -0
заставляет использовать одну строку ввода с нулевым символом в конце для каждой команды.
Как насчет создания командных строк, которые вы хотите запустить, а затем их запуска?
find . -name '*run.sh' -type f -exec \
echo 'c={}; cd ${c%/*} && nohup "./${c##*/}" &' \;
Если результат такой, как вы хотите, просто добавьте | bash
и запустите снова.