Попробуйте следующее:
xmlstarlet sel -t -v //Output_Path -nl data.xml
Один из подходов - выполнить
для файла в * x.txt
do
bfile = $ {afile / a / b}; bfile = $ {bfile / x.txt / y.txt}
cfile = $ {файл / a / c}; cfile = $ {cfile / x.txt / z.txt}
my_command "$ afile" "$ bfile" "$ cfile"
готово
хотя я полагаю, что это небольшое улучшение, и оно могло бы потерпеть неудачу
в патологическом случае, например, с именем файла afoox.txtbarx.txt
.
Также обратите внимание, что это особенность bash;
она может не работать в других POSIX-совместимых оболочках
(в отличие от ##
и %
, которые указаны в POSIX).
Легко сказать
if [-f "$ bfile"]
then
my_command "$ afile" "$ bfile" "$ cfile"
else
echo Error
fi
, чтобы поймать a
выбросы файла
(например, a17x.txt
без соответствующего b17y.txt
).
Если вы поместите
для файла # без списка, по умолчанию будет "$ @"; т.е., аргументы сценария
do
bfile = $ {afile / a / b}; bfile = $ {bfile / x.txt / y.txt}
cfile = $ {файл / a / c}; cfile = $ {cfile / x.txt / z.txt}
если [-f "$ bfile"]
, то
my_command "$ afile" " $ bfile "" $ cfile "
else
echo Error
fi
done
в сценарии, затем вы можете запустить этот сценарий
со списком num x.txt
имен файлов в качестве аргументов,
и он их обработает.
Затем вы можете запустить этот сценарий через xargs
или parallel
.
Проверка выбросов файла b
(например, b42y.txt
без соответствующего a42x.txt
) в рамках вышеуказанного процесса.
- это непросто, но легко выполнить отдельный цикл:
для bfile в b * y.txt
do
afile = $ {bfile / b / a }; afile = $ {afile / y.txt / x.txt}
если [! -f "$ afile"]
затем
echo Error
fi
done
GNU parallel имеет способ сделать это и выполняет команды параллельно в качестве бонуса:
$ parallel my_command {} \
{= s/a([0-9]+)x.txt/b\1y.txt/ =} \
{= s/a([0-9]+)x.txt/c\1z.txt/ =} \
::: a*x.txt
Эти замены являются кодом Perl. Разрывы строк предназначены только для удобства чтения - это однострочный текст.