Я могу извлечь отдельный файл rpm rpm:

rpm2cpio rpm_name | cpio -ivd ./a/b/c/README

Мне нужно извлечь весь каталог /a /b /c / (использование ./a/b/c/ в приведенной выше команде не работает)?

  1. Как это можно сделать?
  2. Могу ли я указать, где создать каталог "c/" вместо ./a/b/c?

1 ответ1

2
  1. используйте подстановочный знак, но будьте осторожны, чтобы защитить его от оболочки:

    rpm2cpio rpm_name | cpio -ivd './a/b/c/*'

  2. Не напрямую, но cpio имеет переключатель -r/--rename . К сожалению, с этим связаны две проблемы: он запрашивает каждый файл и принимает данные непосредственно из /dev/tty . Что означает, что это не так просто автоматизировать. Вы можете использовать expect программу, если вы действительно хотите это сделать. Предупреждение: не для слабонервных;) Обратите внимание, что он не обрабатывает файлы с кавычками (или, возможно, пробелами) должным образом. Он ожидает имя файла rpm, шаблон для извлечения файлов и команду sed для преобразования каждого файла. Пример использования:

    cpio.sh rpm_name './a/b/c/*' 's#^./a/b/#foo/#'

Теоретически сценарий можно было бы expect но это оставлено в качестве упражнения для читателя.

#! /bin/bash

SCRIPT=/tmp/$$.expect
RPM="$1"
FILES="$2"
TRANSFORM="$3"

echo "spawn sh -c \"rpm2cpio \\\"$RPM\\\" | cpio -ird '$FILES'\"" > "$SCRIPT"
rpm2cpio "$RPM" | cpio -it "$FILES" 2>/dev/null | sed "$TRANSFORM" | while read line
do
    echo "send \"$line\\r\"" >> "$SCRIPT"
done
echo "wait" >> "$SCRIPT"
expect "$SCRIPT"
rm -f "$SCRIPT"

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