我在想我可以做这样的事:
wget -O- http://example.com/funky.tar.gz | \
tar --strip-components 1 -Ox | tar -cf fixed.tar.gz
删除下载的 tar 中所有项目的前导路径,但似乎没有办法从 stdin 创建 tar。请证明我错了。
答案1
您当然可以从 stdin 创建 tar。用作-
源,并将要 tar 的内容通过管道传输到其中。
答案2
Pythontarfile
模块支持流读取和写入。你可以将结果TarFile.extractfile()
从一个 tar 文件并将其直接输入到TarFile.addfile()
第二个文件。显然,这需要一点编程,但它会按照您的要求执行。
答案3
在我看来,人们可能会将你想要的东西描述为“流编辑器”柏油文件,允许您应用--strip-components
路径名转换。这个想法是采取柏油文件作为输入并写入修改后的柏油文件作为输出。
没有任何一个柏油我检查了谁的文件(GNU柏油,星星,布斯达)似乎支持您的确切操作。
布斯达很有趣。它的@archive
语法似乎接近于让你读取一个 tarfile 并写入一个修改过的 tarfile,但手册页条目--strip-components
说它只在x
和t
模式下有效。如果它在模式下有效c
,你可以使用如下代码:
wget -O - <url> | bsdtar -c --strip-components 1 -zf new.tar.gz @-
我没有布斯达在我的计算机上(它是柏油在 FreeBSD 中, 也柏油在 Mac OS X 10.6 中(旧版本使用 GNU柏油);它可用作布斯达在某些 Linux 发行版上:Debian GNU/Linux,Ubuntu, 和一些基于 RPM 的发行版),但查看代码,我确信调用只会导致“选项--strip-components在模式-c下不允许”错误。
如果你想要这个,你可能需要自己编写程序(或者找人帮你编写)。幸运的是,这可能并不像听起来那么难。布斯达是基于非常好的库存档库。看起来制作一个可以做你想做的事情的程序相当简单。因为布斯达已经有了将一个档案复制到另一个档案所需的大部分代码(通过它的@archive
处理),你甚至可以通过添加一些功能来实现布斯达一个简单的“不管架构,只要把它做完”的方法可能是启用--strip-components
forc
模式并添加一个调用edit_pathname
里面append_archive
。这种方法的问题在于,所有edit_pathname
转换都将应用于@archive
s 中的条目以及通过其他方式(命令行参数、-T
路径名列表等)指定的实际文件的路径名。这种行为可能符合也可能不符合官方的最佳利益布斯达(可能由于某种原因该模式--strip-components
尚未启用c
)。