我正在.tar
处理一些路径为 的文件example/super_user/Output.*
。
结果.tar
如下:
+ example
+ super_user
- Output.zip
- Output.xml
- Output.txt
但我希望文件如下所示:
- Output.zip
- Output.xml
- Output.txt
您知道我如何在另一个目录中实现这一点吗?
答案1
tar 将保留文件和文件夹结构,因此我认为没有任何方法可以指示 tar 在创建时展平层次结构。
一种解决方法是暂时更改目录,创建 tar,然后返回 - 下面是一个简单的示例:
cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..
答案2
如果目录“example”位于文件系统的根目录,则可以使用另一种方法:
tar -C /example/super_user -cvf result.tar .
这会将目录更改为您想要执行 tar 的位置。需要注意的是,如果 /example/super_user 下有任何子目录,则将保留这些子目录的目录结构。
答案3
我已在此处发布了我的答案:
https://stackoverflow.com/questions/13924856/unix-tar-do-not-preserve-directory-structure
转发(适合懒人)
这很丑陋......但它有效......
我遇到了同样的问题,但是有多个文件夹,我只想将所有文件都平铺。您可以使用选项“transform”传递 sed 表达式,然后...它会按预期工作。
这是表达式:
's/.*\///g'
(删除‘/’之前的所有内容)
这是最终的命令:
tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info
答案4
临时更改目录的另一种方法是将cd
和tar
命令放在括号内(
)
:
(cd example/super_user; tar -cvf ../../result.tar *)
这样做的好处是,当块完成后,您将始终隐式返回到原始目录。另一个好处是,*
在这种情况下使用通配符将匹配临时目录中的文件名。即不需要pushd
..popd
块或跟踪cd
返回的位置。
除了上述命令之外,还有一个特殊cd -
命令可以切换/撤消上次更改目录,例如
cd example/super_user # change to a subdirectory
tar -cvf ../../result.tar *
cd - # undoes the change to the subdirectory