tar 一个没有目录结构的文件列表

Dra*_*kes 4 linux tar centos

说我这样做:

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通常推荐的选项(REFREF),但有多个目录,所以这是行不通的。此外,--xform看起来它需要一个我们没有的固定模式(ref)。

meu*_*euh 5

--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)