我希望这符合"编程问题"类别。
我有一个包含以下结构的 tar 档案:
Folder1/File1
Folder2/File2
Folder3/File3
Folder4/File4
我的目标是从下面的存档中提取特定内容(它很大,因此称为 hugeArchive.tar)。
要提取的数据是自动生成的,并通过文本文件"filesToExtract.txt"提供给我。
"文件提取.txt"的内容:
Folder1
Folder1/File1
Folder2
Folder2/File2
所以我认为这项任务应该很容易,我会使用
cat filesToExtract.txt | xargs tar -xvf hugeArchive.tar
在SunOS 5.10上,这按预期执行,但在Linux Redhat 6.8上,我收到错误(尽管常规提取似乎仍然有效,因为之后文件可用)
输出 SunOS 5.10:
x Folder1, 0 bytes, 0 tape blocks
x Folder1/File1, 386 bytes, 1 tape blocks
x Folder2, 0 bytes, 0 tape blocks
x Folder2/File2, 858 bytes, 2 tape blocks
Linux Redhat 6.8 上的输出:
Folder1/
Folder1/File1
Folder2/
Folder2/File2
tar: Folder1/File1: Not found in archive
tar: Folder2/File2: Not found in archive
tar: Exiting with failure status due to previous errors
我不知道是什么原因造成的,所以我玩了一下并手动更改了输入文件filesToExtract.txt
如下所示:
Folder1/File1
Folder2/File2
现在它可以在Linux上运行,没有任何错误消息。这让我很纳闷: 也许这是一个覆盖问题?或者也许 tar 工具以某种方式只允许访问每个文件一次?
我创建了另一种测试并再次更改filesToExtract.txt
并在那里包含一个副本:
Folder1/File1
Folder2/File2
Folder1/File1
。在那里,我们再次遇到第一次尝试的相同错误:
Folder1/File1
Folder2/File2
tar: Folder1/File1: Not found in archive
tar: Exiting with failure status due to previous errors
我不知道它背后是什么(焦油应该覆盖而不抱怨,不是吗?你有什么想法吗?我的命令错了吗?我必须改变什么,它可以在 Linux 上运行而无需更改filesToExtract.txt
.
顺便说一下,我在两个系统上都使用了标准的 tar 实现。
提前非常感谢!
编辑:
Tripleee建议宁愿使用
xargs tar -xvf hugeArchive.tar <filesToExtract.txt
因为这是一个使用重定向的命令。但这只是为了清晰/有效,不会影响整体问题行为
我可能是错的,但似乎没有令人满意的答案。
如果我在 Linux RH 6.8 上执行"手动"分配,就会发生这种情况:
测试 1:
tar -xvf myHugeArchive.tar Folder1
这将提取文件夹 1 及其内容(文件 1)。我可以根据需要随时重复该命令,而无需删除提取的数据(因此 tar -xvf 确实会覆盖,就像它应该的那样)。
测试 2:
tar -xvf myHugeArchive.tar Folder1/File1
这也适用于创建文件夹 1 并提取文件 1。 我也可以根据需要随时重复此命令。
测试 3:
tar -xvf myHugeArchive.tar Folder1 Folder1/File1
这是提取文件夹和文件,是的,但该过程仍然失败(如预期的那样),并出现问题中描述的错误。
结论:
它不能以这种方式与 GNU-tar 一起工作(除了有一个我不知道的秘密选项参数......最后,似乎我必须首先预处理并删除我的filesToExtract.txt
的"重复项"。