Создать такие же подпапки в другой папке с копированием файлов с определенными именами

Использование 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"

0
19.11.2020, 12:54
2 ответа

Убедитесь, что существует (абсолютный )каталог назначения:

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
0
18.03.2021, 22:48

Использованиеrsync:

rsync -a --include='*/' --include='*.txt' --exclude='*' source_dir/ target_dir

Это должно создать копию иерархии каталогов source_dirкак target_dir, с файлами, имена которых соответствуют *.txtскопированному (только ).

Опции --includeи --excludeобрабатываются слева -- -справа, и первый шаблон, который соответствует имени, "выигрывает". То, как эти параметры используются здесь, гарантирует, что обрабатываются все каталоги, а также любое совпадение имен *.txt, но игнорирует все остальное.

Опция-a(--archive)гарантирует, что иерархия source_dirобрабатывается рекурсивно, и максимально возможное количество метаданных файла сохраняется в копии (подробнее см. в руководстве rsync).

2
18.03.2021, 22:48

Теги

Похожие вопросы