Shell Unix tar:不保留完整路径名
当我尝试使用绝对路径压缩带有Shell Unix tar:不保留完整路径名,shell,unix,tar,Shell,Unix,Tar,当我尝试使用绝对路径压缩带有tar的文件和目录时,绝对路径将保留在生成的压缩文件中。我需要使用绝对路径来告诉tar我要压缩的文件夹位于何处,但我只希望它压缩该文件夹,而不是整个路径 例如,tar-cvzf test.tar.gz/home/path/test——我想在这里压缩文件夹test。然而,我最终实际压缩的是/home/path/test。有什么办法可以避免这种情况吗?我尝试过使用-C操作数,但没有效果。使用-C指定文件所处的目录,然后从该目录中指定文件: 这太难看了。。。但它是有效的 我
tar
的文件和目录时,绝对路径将保留在生成的压缩文件中。我需要使用绝对路径来告诉tar
我要压缩的文件夹位于何处,但我只希望它压缩该文件夹,而不是整个路径
例如,
tar-cvzf test.tar.gz/home/path/test
——我想在这里压缩文件夹test
。然而,我最终实际压缩的是/home/path/test
。有什么办法可以避免这种情况吗?我尝试过使用-C操作数,但没有效果。使用-C
指定文件所处的目录,然后从该目录中指定文件:
这太难看了。。。但它是有效的 我也有同样的问题,但有多个文件夹,我只想把每个文件都放平。您可以使用“transform”选项传递sed表达式并。。。它按预期工作 这是一个表达:
's/*\///g'
(删除'/'之前的所有内容)
这是最后一个命令:
tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info
多目录示例 tar cvzf my.tar.gz example.zip-C dir1文件\u在\u dir1下-C dir2文件\u在\u dir2下
目录1/2下的文件不应具有路径 tar可以在文件名进出存档的过程中执行转换。考虑这样一个例子,它将一组文件存储在一个扁平的TARFILE中: 在root~/目录中
-T-
选项告诉tar从stdin读取文件列表,--xform='s | ^.*/| | |'
将sed表达式应用于所有文件名,就像读取文件名之后和存储文件名之前一样--“显示已转换”只是在转换后向您显示文件名的一种好方法,默认情况下是在读取文件名时显示文件名。
除了使用find指定要归档的文件之外,毫无疑问还有其他方法。例如,如果在bash中设置了dotglob
,则可以使用**模式对任意数量的目录进行通配符,从而将之前的设置缩短为:
tar -cvf test.tar --xform='s|^.*/||' --show-transformed logger/**/*.sh
考虑到您要查找的文件,您必须判断什么最适合您的情况。是否有编程上下文?如果不是,它可能属于Unix.SE,而不是Stack Overflow.true,虽然这可能与shellscripting相关,但它没有这样标记。我将它用于shell脚本,但我将问题简化为上下文之外的问题。我可能需要提供额外的细节(又名上下文)来找到解决方案,所以我在这里发布。我现在就给它贴上这样的标签。@OliverJosephAsh-你看到我的答案了吗?是的,我在等着把它标记为正确:)这是我所看到的唯一一个真正符合我所寻找的答案。与此相结合可以获得多个目录的更好结果。类似于
find./commondir-typef | tar--transform's/*\///g'-cvzf./file.tar.gz--files from=/dev/stdin
。这样将排除空的子目录。令人印象深刻!从中发现,这仍然保留了相对于指定根目录的目录结构,这不是问题所要问的(虽然这显然是OP所需要的),而是+1,因为这正是我想要的(另一个答案中的单边扁平化方法似乎是一件奇怪的事情)。
find logger -name \*.sh | tar -cvf test.tar -T - --xform='s|^.*/||' --show-transformed
tar -cvf test.tar --xform='s|^.*/||' --show-transformed logger/**/*.sh