bash - запустить скрипт, основанный на подстроке имени файла (возможно, с использованием подстановочного знака) - PullRequest
1 голос
/ 07 января 2012

У меня есть следующий простой скрипт, который вызывает внешний скрипт с несколькими именами файлов и аргументами либо разделителя, либо набора позиций вырезания.Мой вопрос: есть ли способ сделать имя файла «динамическим с использованием подстановочных знаков» в том смысле, что каталог всегда будет содержать эти имена файлов, но с дополнительным текстом на обоих концах?Но сценарий может выполнить какое-то совпадение, чтобы получить полное имя файла на основе «содержит».

current / release / ext / содержимое каталога:

2011storesblah.dat
hrlatest.dat
emp_new12.txt

т.е. каталог содержитЭти файлы сегодня (но на следующей неделе имена файлов в этом каталоге могут иметь несколько иной префикс. Например:

stores_newer.dat
finandhr.dat
emps.txt

Сценарий:

 #!/bin/bash
    FILES='/release/ext/stores.dat "|"
    /release/ext/emp.txt 1-3 4-11 15-40
    /release/ext/hr.dat "|" 2'
    for f in $FILES
    do
        echo `sh myexternalscript.sh $f`;
    done

Примечание: нет необходимости обрабатыватьсценарий, в котором файл в моем скрипте соответствует более чем двум файлам в директории (он всегда будет совпадать только с одним). Также он может соответствовать только типам файлов, указанным в скрипте. Кроме того, мне не нужно искать рекурсивно,просто нужно искать только в каталоге / release / ext /. Я использую SunOS 5.10.

Ответы [ 2 ]

1 голос
/ 08 января 2012

Неясно, для чего используются символы и цифры канала в вашей переменной $FILES.Однако вот что вам может пригодиться:

#!/bin/bash
filespecs='*stores*.dat *hr*.dat *emp*.txt'
dir='/release/ext'

cd "$dir"
for file in $filespecs
do
    sh myexternalscript.sh "$dir/$file"
done

Обратите внимание, что ваш вопрос помечен как "bash", и вы используете "bash" в своем шебанге, но по какой-то причине вы используете "sh", когда выназови свой другой сценарий.В некоторых системах sh является символической ссылкой на Bash, но при непосредственном вызове она будет вести себя иначе, чем Bash.Во многих системах sh полностью отделен от Bash.

Чтобы расширить глобусы и включить другие аргументы, вам нужно будет нарушить правило Bash всегда заключать в кавычки переменные (это пример одного изисключения).

filespecs='*stores*.dat | 3
*hr*.dat 4 5
*emp*.txt 6 7 8'
while read -r spec arg1 arg2 arg3 arg4
do
    sh myexternalscript.sh "$dir"/$spec "$arg1" "$arg2" "$arg3" "$arg4"
done < <(echo "$filespecs")

Используйте столько аргументов "arg", сколько вам нужно.Дополнения будут переданы как пустые, но установить аргументы.Если аргументов для их принятия больше, чем переменных, тогда последняя переменная будет содержать все остатки в дополнение к той, которая ей соответствует.Эта версия не нуждается в cd, так как глобус не раскрывается, пока не будет добавлен каталог, в то время как в первой версии глобус расширяется до того, как каталог будет добавлен.

Если вы заключите в кавычки каналытаким образом, как показано в вашем вопросе, двойные кавычки будут включены в аргумент.В способе, который я показываю, передается только символ канала, но он защищен, поскольку переменная заключена в кавычки в момент обращения к ней.

1 голос
/ 07 января 2012
$FILES=`find /release/ext -name *stores*.dat`
for FILE in $FILES do
  # need to test for empty, case $FILES is empty
  test -n "$FILE" && /do/whatever/you/want
done;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...