Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell Unix tar:不保留完整路径名_Shell_Unix_Tar - Fatal编程技术网

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