Como disse @slhck, o shell não é realmente a ferramenta certa para escrever XML (embora não seja tão ruim quanto tentar analisar o XML no shell ...), mas não é muito difícil fazer um download rápido e sujo script:
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"
Então, o que há de errado com o acima, que você gostaria de usar algo com uma biblioteca XML real em vez disso? Bem, considere o que aconteceria com o item acima se algum nome de arquivo contiver "<" ou ">" (que são perfeitamente caracteres legais em nomes de arquivos unix)? Fazer isso corretamente envolve codificar os nomes dos arquivos com entidades HTML e (AFAIK) o shell não possui boas ferramentas para isso; uma boa biblioteca XML irá lidar com esse tipo de coisa automaticamente.
Algumas notas no script: primeiro, observe que o primeiro echo
redireciona com ">", enquanto todas as gravações subseqüentes no arquivo de saída usam "> >" - isso é porque ">" esvazia o arquivo antes de escrever, então você quer isso apenas na primeira gravação.
Em segundo lugar, eu uso echo
para a primeira e a última gravações, mas cat
com um documento aqui no loop - isso é apenas uma questão de conveniência, porque echo
é mais fácil para gravações de linha única , mas o here-docs é mais fácil de fazer gravações em várias linhas. Você poderia facilmente usar echo
em todos os lugares ou cat <<
em todos os lugares se quisesse ser consistente.
Em terceiro lugar, tenho a tendência de citar duas vezes tudo o que contém uma variável. Esta é uma maneira de evitar problemas com caracteres especiais (como espaços) em coisas como nomes de arquivos. Em geral, eu sigo o princípio de que você deve citar tudo, a menos que haja uma razão específica para não citar. É ruim o suficiente o XML terá problemas com caracteres especiais, eu não quero problemas no nível do shell também.