![修改 tar 文件中的文件名而不将文件解压到临时位置](https://linux22.com/image/176225/%E4%BF%AE%E6%94%B9%20tar%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E8%80%8C%E4%B8%8D%E5%B0%86%E6%96%87%E4%BB%B6%E8%A7%A3%E5%8E%8B%E5%88%B0%E4%B8%B4%E6%97%B6%E4%BD%8D%E7%BD%AE.png)
我有一个 tar 文件,其中包含名为 的文件夹中的一些文件old_name
。现在我想创建一个新的 tar 文件,其中该文件夹已被重命名,而new_name
无需提取到文件到磁盘,因为对于大型存档来说,这会明显变慢(磁盘读写速度增加一倍以上)。
我知道该怎么做:tar -xf old.tar; tar -cf new.tar --transform 's/old_name/new_name/' old_name
我尝试了一些方法,但似乎都不起作用:
tar -cOf old.tar | tar -xf new.tar --transform 's/old_name/new_name/'
cat old.tar | tar --delete --transform 's/old_name/new_name/' > new.tar
cat old.tar | tar -u --transform 's/old_name/new_name/' > new.tar
但似乎没有任何作用。
关闭后我发现有这些:
但这些是关于删除 tarball 中的文件,而不是更改它们的路径。
答案1
tar 可以创建或提取 tar,但不能以这种方式对流进行操作。
你需要类似的东西tar-stream
- 它甚至有一个例子可以满足你的要求:
https://github.com/mafintosh/tar-stream#modifying-existing-tarballs
答案2
你试过了吗存档挂载要将存档安装到安装点,重命名目录,然后卸载存档?
$ archivemount archive.tar /mnt/archive
$ ls /mnt/archive
/mnt/archive/archive/file1
/mnt/archive/archive/file2
$ mv /mnt/archive/archive/file2 /mnt/archive/archive/file3
$ ls /mnt/archive
/mnt/archive/archive/file1
/mnt/archive/archive/file3
$ umount /mnt/archive
$ tar -tf archive.tar
archive/file1
archive/file3
# It will move the original archive to archive.tar.orig
$ tar -tf archive.tar.orig
archive/file1
archive/file2
我在这个相关答案中找到了该工具:如何将文件添加/更新到现有的 tar.gz 存档?。它还提到了一个类似的工具tarfs
。