我可以提取单个文件转速转速:
rpm2cpio rpm_name | cpio -ivd ./a/b/c/README
我需要提取整个 /a/b/c/ 目录(在上面的命令中使用 ./a/b/c/ 不起作用)?
- 如何才能做到这一点?
- 我可以指示在哪里创建目录“c/”而不是./a/b/c 吗?
答案1
使用通配符,但要小心保护它免受 shell 的攻击:
rpm2cpio rpm_name | cpio -ivd './a/b/c/*'
不是直接的,但
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"