bsdtar
我从源代码(从 libarchive 网站)安装,因为我rpm
在yum
.
我能够看到bsdtar
的帮助消息。例如:
$ bsdtar --help
First option must be a mode specifier:
-c Create -r Add/Replace -t List -u Update -x Extract
Common Options:
...
bsdtar 3.1.2 - libarchive 3.1.2
但是当我尝试提取文件时,出现以下错误:
$ bsdtar -xzC . < archive.tar.gz
bsdtar: Error opening archive: Failed to open '/dev/st0'
我该如何修复这个错误?
答案1
在x
模式下,tar
require的所有 POSIX 兼容版本-f
从默认值以外的位置读取输入存档。要读取stdin
,POSIX 还要求您提供-
文件名:
$ tar -xf - < file.tar
GNUtar
和GNU 都bsdtar
理解该语法。
GNUtar
与 POSIX 的不同之处在于它接受tar
以下位置的存档:stdin
没有明确的-f -
论点。事实上,POSIX 说如果没有-f -
,则根本不应该使用stdin
。从你的问题可以清楚地看出,你是从 GNUtar
用户那里获取命令行示例的。
bsdtar
遵循 POSIX-f -
如果您希望它读取stdin
而不是文件,则需要它。
这给我们带来了您的实际问题:当没有给出时-f -
,为什么bsdtar
选择读取/dev/st0
?这就是我上面提到的默认值。 POSIX 仅表示此默认值是“系统相关的”;bsdtar
选择使用第一个的名称磁带机的开发节点,这恰好是/dev/st0
在 Linux 上。1
你需要这样说:
$ bsdtar -xf - < archive.tar.gz
或者,完全跳过重定向:
$ bsdtar -xf archive.tar.gz
我删除是-z
因为 GNUbsdtar
和 GNUtar
都会自动检测模式gzip
下的压缩x
。 (旧版本的 GNUtar
确实需要压缩类型标志,但是1.15版本添加自动检测,于 2004 年发布。)
我还删除了该-C .
位,因为它只是告诉bsdtar
您在解压存档之前更改到当前目录。它是无操作。