使用 bsdtar 提取存档时,为什么会出现错误:“无法打开 '/dev/st0'”?

使用 bsdtar 提取存档时,为什么会出现错误:“无法打开 '/dev/st0'”?

bsdtar我从源代码(从 libarchive 网站)安装,因为我rpmyum.

我能够看到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模式下,tarrequire的所有 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您在解压存档之前更改到当前目录。它是无操作


  1. 为什么默认为第一个磁带机?因为tar是磁带归档器tar来自一次事实上,几乎每个 Unix 机器都有一个磁带驱动器。

相关内容