从tar存档中提取选定/特定文件会导致SunOS和Linux上的不同行为

时间:2017-03-27 14:58:20

标签: linux bash tar sunos

我希望这符合类别"编程问题"。

我有一个包含以下结构的tar-archive:

Folder1/File1
Folder2/File2
Folder3/File3
Folder4/File4

我的目标是从以下内容中提取特定内容(这个内容很大,因此名为hugeArchive.tar)。

要提取的数据会自动生成并通过textfile" filesToExtract.txt"提供给我。

" filesToExtract.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改为:{/ p>

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

我不知道它背后是什么(实际上tar应该覆盖而不抱怨,不应该这样吗?)。你有什么主意吗?我的命令错了吗?我必须改变什么,它在Linux上运行而不必更改filesToExtract.txt

顺便说一句,我在两个系统上使用标准的tar实现。

提前多多感谢!

修改

tripleee建议改为使用

xargs tar -xvf hugeArchive.tar <filesToExtract.txt

因为这是一个使用重定向的命令。但这只是为了清晰/有效,并且不会影响整体问题行为

1 个答案:

答案 0 :(得分:0)

我可能错了,但似乎没有令人满意的答案。

如果我在Linux RH 6.8上执行“手动”应用程序,则会发生这种情况:

测试1:

tar -xvf myHugeArchive.tar Folder1

这将提取Folder1及其内容(文件1)。我可以随意重复该命令,而不需要删除提取的数据(因此tar -xvf确实会覆盖,就像它应该的那样)。

测试2:

tar -xvf myHugeArchive.tar Folder1/File1

这也可以工作并创建Folder1并提取文件1。 我也可以随意重复这个命令。

测试3:

tar -xvf myHugeArchive.tar Folder1 Folder1/File1

这会提取文件夹和文件,是的,但过程仍然失败(如预期的那样),问题中描述的错误。


结论:

它不能用GNU-tar那样工作(除了有一个我不知道的秘密选项参数......)。最后,似乎我必须首先预处理并删除那些“重复种类”filesToExtract.txt