如何在 Ubuntu 中复制特殊文件 (steam.pipe)?

Ida*_*dad 4 command-line steam

我已经使用 Ubuntu 一段时间了,遇到了这个问题:

我现在正在使用 ubuntu 14.10,并且在我的/home/user/.steam文件夹中安装了 Steam 。当我.steam在我的主目录中复制文件夹并且进度条接近尾声时,它显示一条消息,指示“无法复制特殊文件 steam.pipe”,或多或少听起来像这样。

自从使用 Ubuntu 14.04 以来,我就遇到过这个问题,但我知道这不是发行版/发行版问题,而是文件复制问题。幸运的是,我可以通过在我的.steam文件夹中使用命令来解决这个问题:

sudo cp -f ./steam.pipe /[destination]

最终,就在今天,我无法使用上面的命令复制这个文件。终端卡在:

Idad@IdadComp:/home/Idad/.steam$sudo cp -f ./steam.pipe /[destination]

并没有回到

Idad@IdadComp:/home/Idad/.steam$

表示复制过程没有完成。

我的问题是,我怎样才能复制这个 steam.pipe 文件?

我试过:

  1. 在超级用户模式下运行 nautilus,但仍然失败。
  2. 尝试在目标文件夹中压缩和解压缩此文件,但在解压缩steam.pipe文件时出错。
  3. 并阅读此链接如何复制或(快速且轻松地)备份“特殊文件”?,但没有得到任何结果。

在此先感谢您的帮助。:)

Eli*_*gan 6

正如穆鲁所说,你不应该后退steam.pipe。如果它丢失,Steam 应该能够重新创建它。但是,在备份~/.steam文件夹时,您应该检查是否还有~/.local/share/Steam文件夹。如果是这样,您可能也想备份它。它通常包含与 Steam 安装相关的大部分文件,包括您安装的 Steam 游戏。

我写了这个答案的其余部分以防万一:

  • 您想知道为什么使用 Nautilus 和cp.
  • 您想知道如何复制文件steam.pipe,以防万一您确实需要这样做。

执行摘要是,你应该rsync你的备份。有关详细信息、解释和替代方案,请参见下文。


为什么steam.pipe特别

steam.pipe一个 FIFO,又名命名管道

ek@Io:~/.steam$ ls -l steam.pipe
prw------- 1 ek ek 0 Mar  7 20:12 steam.pipe
ek@Io:~/.steam$ file steam.pipe
steam.pipe: fifo (named pipe)
Run Code Online (Sandbox Code Playgroud)

FIFO 不是常规文件,而是特殊的文件系统条目,可以像文件一样进行交互。写入 FIFO 将数据存储在内存中,直到从 FIFO 中读取数据为止。从 FIFO 中读取数据是按照写入的顺序获得的(所以是先进先出)。

为什么你无法复制它

在尝试复制 FIFO 时,实际上可能需要两种不同的行为。你想要哪一种取决于具体情况。

  • 您可能想要复制 FIFO,即制作另一个 FIFO。(在这种情况下,这就是您想要的。)
  • 您可能希望从 FIFO 读取数据,即复制其内容。(这可能看起来不像“复制”,但请记住,这类似于复制文件时发生的情况——打开文件,读取其数据,并将相同的数据写入新文件。)

您尝试了两个程序:

  • Nautilus 会自动检测特殊条目,例如 FIFO,拒绝从中复制,并警告您它已经这样做了。
  • cp从 FIFO 读取数据,而不是制作 FIFO 本身的副本。如果 FIFO 中没有数据,则cp停止直到某个进程写入数据。

制作特殊文件的副本(如 FIFO)

要复制 FIFO,您可以使用rsync以下--specials标志:

ek@Io:~$ cd steam-backup
ek@Io:~/steam-backup$ rsync --specials ~/.steam/steam.pipe .
ek@Io:~/steam-backup$ ls -l steam.pipe
prw------- 1 ek ek 0 Apr 22 11:43 steam.pipe
Run Code Online (Sandbox Code Playgroud)

那就是如果你想单独复制它。要复制整个文件夹以进行存档——也就是说,您希望大部分内容保持原样,以便在恢复时正常工作——您可以使用rsync -a

rsync -a .steam/ steam-backup
Run Code Online (Sandbox Code Playgroud)

有关 的更多信息rsync,请参阅Ubuntu 帮助 wiki 中的“rsync”上游 rsync 网站man rsync(具体解释了-a标志的作用)。

cp非常适合简单的用例,但我建议rsync进行备份。

特价商品也可以存档

备份文件夹的另一种方法是使用 对其进行存档,这tar也将自动保留 FIFO(即,它们将在提取时重新创建):

ek@Io:~$ tar cvJf steam-backup.tar .steam
.steam/
.steam/registry.vdf
.steam/sdk32
.steam/bin64
.steam/root
.steam/steam_install_agreement.txt
.steam/steam
.steam/steam.pipe
.steam/steam.pid
.steam/bin
.steam/sdk64
.steam/bin32
Run Code Online (Sandbox Code Playgroud)

手动重新制作 FIFO

如果您丢失了 FIFO(在备份中或一般情况下)并需要恢复它,您只需使用mkfifo.

您需要使用正确的权限创建它。运行ls -lsteam.pipe显示的权限掩码prw-------p只是意味着它是一个名为p IPE(FIFO)。其余的意味着它的所有者可读和可写,并且没有其他权限(有关详细信息,请参阅FilePermissions)。因此八进制权限掩码为 600(或 0600),因此您需要传递-m 600mkfifo

ek@Io:~/steam-backup$ mkfifo -m 600 steam.pipe
ek@Io:~/steam-backup$ ls -l steam.pipe
prw------- 1 ek ek 0 Apr 22 12:09 steam.pipe
Run Code Online (Sandbox Code Playgroud)

复制 FIFO 不会复制其“内容”

这对于备份来说不是问题,但您应该知道复制 FIFO(例如,使用rsync)只会使新的 FIFO 像它一样。如果 FIFO 中有数据可供读取,则新 FIFO 中的数据将不可用。

这对备份来说不是问题的原因是 FIFO 不适用于长期存储。它们甚至根本不是用于存储。FIFO 中的数据不会写入磁盘,当进程写入 FIFO 时,在读取数据之前,甚至不会向进程报告写入成功。(同样,如果一个进程从一个没有数据的 FIFO 中读取,读取将停止,直到数据被写入。)

您可以看到这一点,并通过自己制作一个并对其进行试验来更好地了解 FIFO 的工作原理。您可以使用 来创建foo具有默认权限的新 FIFO mkfifo foo,并使用类似 的命令将文本重定向到它echo 'Hello, world!' > foo。这将停止,因为还没有阅读文本。然后,在另一个终端(例如,另一个终端选项卡)中阅读文本cat foo并查看每个终端中发生的情况。