Использование awk и eval:
eval "$(awk -F: '{ print $1 "='\''" $2 "'\''" }' tmp)"
Команда внутри $()
анализирует файл summary.txt. С опцией -F
мы указываем awk использовать :
в качестве разделителя полей. Он форматирует каждую строку следующим образом:
Total_Pass='24'
Мне пришлось экранировать одинарные кавычки ; вот почему код выглядит так уродливо.
eval используется для выполнения форматированного текста точно так же, как вы написали это в своем скрипте. Как вы можете догадаться, это опасно , если у вас нет полного контроля над входными данными. См. Почему в Bash следует избегать использования eval и что следует использовать вместо него? Возможно, кто-то может указать более безопасный способ сделать это.
Затем вы можете использовать свои новые переменные следующим образом:
printf "Total_Pass with value %s\n" "$Total_Pass"
Убедитесь, что существует (абсолютный )каталог назначения:
mkdir -p "$DST_DIR"
Перейти в исходный каталог (он не должен быть потомком или родителем $DST _DIR):
cd "$SRC_DIST"
Re -создайте структуру каталогов (это не удастся, если у вас есть каталоги с '\n' в их именах):
find. -type d -print | xargs -I% mkdir -p "$DST_DIR"/%
Скопируйте туда интересующие файлы (в данном примере :*.txt и *.h):
find. \( -name \*.txt -o -name \*.h \) -print0 | cpio -pvdm0 "$DST_DIR"
Если вам не нужны каталоги, не содержащие целевых файлов, вы можете просто сделать:
find. \( -name \*.txt -o -name \*.h \) -print0 \
| cpio -pvdm0 $DST_DIR
Использованиеrsync
:
rsync -a --include='*/' --include='*.txt' --exclude='*' source_dir/ target_dir
Это должно создать копию иерархии каталогов source_dir
как target_dir
, с файлами, имена которых соответствуют *.txt
скопированному (только ).
Опции --include
и --exclude
обрабатываются слева -- -справа, и первый шаблон, который соответствует имени, "выигрывает". То, как эти параметры используются здесь, гарантирует, что обрабатываются все каталоги, а также любое совпадение имен *.txt
, но игнорирует все остальное.
Опция-a
(--archive
)гарантирует, что иерархия source_dir
обрабатывается рекурсивно, и максимально возможное количество метаданных файла сохраняется в копии (подробнее см. в руководстве rsync
).