从 tar 中提取单个文件到其他文件夹

lin*_*s31 7 scripting tar directory aix

我已经为这个问题搜索了多个论坛,并看到了不同的答案,但到目前为止,即使是我在这里看到的,也没有任何效果。

我想从 tar 中提取单个文件到不同的目录。

我试过这个:

tar xvf file.tar -C /home/dir/ filename
Run Code Online (Sandbox Code Playgroud)

或这个:

tar -x filename -f file.tar -C /home/dir
Run Code Online (Sandbox Code Playgroud)

但分别得到了这些错误:

x filename, 14826 bytes, 29 media blocks.
File -C not present in the archive.
File /home/dir not present in the archive.
Run Code Online (Sandbox Code Playgroud)

和:

tar: /dev/rmt0: A file or directory in the path name does not exist.
Run Code Online (Sandbox Code Playgroud)

第一个提取文件但在同一目录中,而不是我想要的文件夹。

Mik*_*kel 10

在 的大多数版本中tar,有两种不同的模式,具体取决于您是否在选项前加上减号。

AIX tar 手册页的顶部总结了不同之处:

Berkeley Standards:

tar {c|r|t|u|x} ... [ Archive ] Directory | File ...

X/Open Standards:

tar {-c|-r|-t|-u|-x} ... [-f Archive] ... [-C Directory] File | Directory...
Run Code Online (Sandbox Code Playgroud)

没有减号,tar在伯克利兼容模式下工作。在这种模式下,选项不遵循现在标准的 UNIX 命令行约定。相反,所有标志必须放在一起(以任何顺序)。该f标志意味着该标志后的第一个字是应该用来代替磁带驱动器中的文件名,/dev/rmt0。(tintar代表磁带,默认值反映了这一点。)另请注意,-C兼容模式中没有选项。

使用减号,tar就像大多数 UNIX 命令一样工作。必须首先指定所有标志(及其参数),然后是非标志。 -f将文件名作为参数(本质上,文件名属于-f标志),因此file.tar必须紧跟在-f. 这就是为什么男人页说,[-f Archive]Archive旁边-f。但不-x接受任何参数(filename不属于-x)。再次查看手册页,filename在您的示例中对应于File | Directory...,它们一直位于命令行的末尾。

命令的固定版本看起来像

(cd /home/dir; tar xvf /path/to/file.tar filename)
Run Code Online (Sandbox Code Playgroud)

tar -x -f file.tar -C /home/dir filename
Run Code Online (Sandbox Code Playgroud)

GNU tar 做了类似的事情。 三种选项样式很好地解释了差异。