linux найти позиционный параметр exec

В настоящее время я использую следующую строку, чтобы найти несколько скриптов и выполнить их. Сценарии называются: my_script_0.sh, my_script_1.sh и т. Д.

find $MY_HOME/SHELL/my_script_[0-9].sh -type f -exec csh -c '"$1" >& "$logfile" &' {} \;

Это прекрасно работает за исключением того, что теперь я хотел бы создать уникальный $logfile для каждого из выполненных скриптов. Я понимаю, что используя awk, я мог бы сделать что-то вроде этого, чтобы получить номер файла и затем использовать его в имени файла журнала.

find $MY_HOME/SHELL/my_script_[0-9].sh -type f | awk -F"\\.|_" '{print $4}'

Проблема в том, что я не верю, что смогу использовать awk с исходным оператором, поскольку мне нужно, чтобы позиционный параметр был полным путем / именем файла.

В идеале я хотел бы просто использовать другой позиционный параметр с командой find -exec. Это существует?

1 ответ

Решение

-exec возможность find просто оправдывает приведенные аргументы. Так как вы передаете это csh -c ... он запустит новую оболочку, в которую вы можете передать некоторые аргументы (один из которых {}). Эти аргументы затем устанавливаются как позиционные аргументы $1, $2, $3, ... ,$n в новой оболочке. В этом случае find результаты передаются по одному и используются как $1 в оболочке.

Я предложу альтернативу вашему find команда, которая использует цикл вместо:

foreach script ( $MY_HOME/SHELL/my_script_[0-9].sh )
    csh -c "$script >& $script:r.log"
end

:r удаляет расширение переменной, к которой он присоединен, так что мы получаем файл журнала: my_script_n.log для сценария my_script_n.sh,

Я проверил эти ссылки на синтаксис C-оболочки:

Другие вопросы по тегам