说我这样做:
tar cvf allfiles.tar $(<mylist.txt)
和mylist.txt包含这个:
/tmp/lib1
/tmp/path2/lib2
/path3/lib3
Run Code Online (Sandbox Code Playgroud)
如何对文件进行 tar,以便 tarball 只包含
lib1
lib2
lib3
Run Code Online (Sandbox Code Playgroud)
根本没有目录结构?
该-C
的--directory
通常推荐的选项(REF,REF),但有多个目录,所以这是行不通的。此外,--xform
看起来它需要一个我们没有的固定模式(ref)。
该--xform
参数采用任意数量的sed
替代表达式,它们非常强大。在您的情况下,使用匹配所有内容直到最后一个的模式/
并将其替换为空:
tar cvf allfiles.tar --xform='s|.*/||' $(<mylist.txt)
Run Code Online (Sandbox Code Playgroud)
添加--show-transformed-names
以查看新名称。
请注意,此替换适用于所有文件名,而不仅仅是命令行上给出的文件名,因此,例如,如果您有一个文件/a/b/c
并且您的列表只指定了/a
,那么最终的文件名只是c
,而不是b/c
。您总是可以更明确并提供准确的替换列表,例如在您的情况下
--xform='s|^tmp/path2/||;s|^tmp/||;s|^path3/||'
Run Code Online (Sandbox Code Playgroud)
请注意,初始值/
将被 tar 删除(除非您使用-P
),因此上述表达式缺少它。此外,必须对目录列表进行排序,以便首先完成最长的匹配,否则tmp/path2/
将不匹配,因为tmp/
已被删除。但是您可以自动创建此列表,例如:
--xform="$(sed <mylist.txt 's|[^/]*$||; s|^/||; s:.*:s|^&||;:' | sort | tr -d '\n')"
Run Code Online (Sandbox Code Playgroud)