1

Мне нужно получить имена файлов, которые начинаются со строки testfile. Также я хочу создать файл XML в том же месте и записать эти имена файлов в XML.

<path>
 <dir>
     <file>testfile1</file>
 </dir>
 <dir>
     <file>testfile2</file>
 </dir>
<path>

2 ответа2

2

Как сказал @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 будут проблемы со специальными символами, я не хочу проблем на уровне оболочки.

1

Оболочка bash может создать файл XML, содержащий имена файлов, соответствующих шаблону (в данном случае testfile*):

#!/bin/bash

XML_LIST="$HOME/xml.list"
touch $XML_LIST
#find files matching the regex
find /home/ -name "testfile*" -print0 | xargs -n1 -0  >> /tmp/temp_filelist

echo "<path>" > $XML_LIST

#read list of files from TMP_FILE
#declare array 
declare -a FILE_NAMES
#open file for reading to array
exec 10</tmp/temp_filelist
while read LINE <&10; do
    FILE_NAMES[$count]=$LINE
    if [ "$LINE" != "" ]; then
        echo " <dir>" >> $XML_LIST
        echo "     <file>$LINE</file>" >> $XML_LIST
        echo " </dir>" >> $XML_LIST
    fi
done
#close temp read file 
exec 10>&-

echo "</path>" >> $XML_LIST
echo "done"

Читать это в оболочку будет сложнее, но все же возможно.

Для такого рода сценариев я бы порекомендовал другой родной язык Linux, Python, который легко выучить и который имеет специализированную библиотеку XML, чтобы сделать возможным описанный выше процесс записи, а также чтение файла XML в меньшем количестве строк кода!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .