我想创建一个文件列表的tar文件。文件列表应从名为input.txt的单独文件中读取。
这是input.txt-的内容
- /var/opt/SM/logs/rq/log.txt
- /var/opt/DC/mq/mqlog.txt
- /var/opt/config.cg
压缩文件应该有一个目录结构-
- /logs/SM/logs/rq/log.txt
- /logs/DC/mq/mqlog.txt
- /logs/config.cg
/var/opt/如果输入文件路径中存在,则应将其替换为/logs。
这是在sayroot目录中提取tar文件时的预期输出。
- root/logs/SM/logs/rq/log.txt
- root/logs/DC/mq/mqlog.txt
- root/logs/config.cg
使用转换选项:
tar cf archive.tar --transform 's%^var/opt%logs%' /var/opt
下面的脚本演示了基于以下问题和答案的解决方案:
- https://stackoverflow.com/a/8033898/10622916
- https://unix.stackexchange.com/q/421766/330217
这些命令仅使用GNUtar
进行测试。
#! /bin/sh
set -x
# prepare environment
mkdir -p foo/bar
rm -f input.txt
rm -f output.tar
for i in 1 2 3
do
echo $i > foo/bar/file$i
echo foo/bar/file$i >> input.txt
done
# create archive with file name transformation
tar cvf output.tar --transform='s|^foo/bar|baz|' -T input.txt
# list archive contents
tar tvf output.tar
输出
+ mkdir -p foo/bar
+ rm -f input.txt
+ rm -f output.tar
+ for i in 1 2 3
+ echo 1
+ echo foo/bar/file1
+ for i in 1 2 3
+ echo 2
+ echo foo/bar/file2
+ for i in 1 2 3
+ echo 3
+ echo foo/bar/file3
+ tar cvf output.tar '--transform=s|^foo/bar|baz|' -T input.txt
foo/bar/file1
foo/bar/file2
foo/bar/file3
+ tar tvf output.tar
-rw-r--r-- bmeissner/1049089 2 2021-07-05 16:11 baz/file1
-rw-r--r-- bmeissner/1049089 2 2021-07-05 16:11 baz/file2
-rw-r--r-- bmeissner/1049089 2 2021-07-05 16:11 baz/file3
这对我很有效-tar-czf myarchive.tar-T/var/opt/input.txt--transform='s |^var/opt/|logs|'