Как сказал @slhck, оболочка на самом деле не является подходящим инструментом для написания XML (хотя это не так плохо, как попытка разобрать XML в оболочке ...), но не так сложно сделать быстрый и грязный скрипт:
targetdir="/path/to/dir/of/files"
prefix="testfile"
outfile="$targetdir/out.xml"
# Write the opening tag(s):
echo "<path>" >"$outfile"
# Loop through the matching files, writing entries for each one:
for f in "$targetdir/$prefix"*; do
cat <<END_INSERT >>"$outfile"
<dir>
<file>$(basename "$f")</file>
</dir>
END_INSERT
done
# Write the closing tag(s):
echo "</path>" >>"$outfile"
Так что плохого в том, что выше, что вы хотите использовать что-то с реальной библиотекой XML вместо этого? Хорошо, подумайте, что произойдет с вышеизложенным, если какие-либо имена файлов будут содержать «<» или «>» (которые являются абсолютно допустимыми символами в именах файлов unix)? Выполнение этого права включает в себя кодирование имен файлов с помощью сущностей HTML, и (AFAIK) оболочка не имеет хороших инструментов для этого; хорошая библиотека XML просто автоматически справится с подобными вещами.
Несколько замечаний по поводу сценария: во-первых, обратите внимание, что первый echo
перенаправляет с «>», в то время как все последующие записи в outfile используют «>>» - это потому, что «>» очищает файл перед записью, поэтому вы хотите это только по первому пишу.
Во-вторых, я использую echo
для первой и последней записи, но cat
с здесь-документом в цикле - это просто вопрос удобства, потому что echo
проще всего для однострочных записей, а здесь-документ проще многострочный пишет в. Вы можете легко использовать echo
везде или cat <<
везде, если хотите быть последовательными.
В-третьих, я склонен заключать в кавычки все, что содержит переменную. Это способ избежать проблем со специальными символами (например, пробелами) в таких вещах, как имена файлов. В общем, я придерживаюсь принципа, что вы должны цитировать все, если нет особых причин не делать этого. Достаточно плохо, что у XML будут проблемы со специальными символами, я не хочу проблем на уровне оболочки.