从 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. 使用通配符,但要小心保护它免受 shell 的攻击:

    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"

相关内容