如何恢复被杀死的 tar 命令

mth*_*pvg 12 tar

我正在做一个 :tar -cvf并且我不得不用ctrl-C. 我知道我应该做一个Ctrl-Z然后将任务带回前台......但这不是故事。

我可以从我停止任务的那一点继续吗?

Ruc*_*t88 13

此方法将重新创建您的 tar 存档,并将完成的部分附加到现有文件中。如果通过网络连接进行备份,这会很有用。如果您的 INFILES 中的任何数据发生更改,您可能会导致存档损坏。请务必在完成后测试您的存档。

在下一行中将 INFILES 和 OUTFILE 更改为正确的名称。

INFILES="my folder"; OUTFILE="archive.tgz"; SIZE="$(wc -c < $OUTFILE)"; tar -cz --to-stdout "$INFILES" | tail -c +$(($SIZE+1)) >> "$OUTFILE"
Run Code Online (Sandbox Code Playgroud)

解释:

SIZE="$(wc -c < $OUTFILE)" # 获取档案的当前大小。

tar -cz --to-stdout "$INFILES" |# 开始创建存档并将输出发送到tail命令。

tail -c +$(($SIZE+1)) >> # 忽略 $SIZE+1 之前的数据,并恢复存档 $OUTFILE 的其余部分。

  • 我认为这比重新启动 tar 进程要快,因为它实际上没有向磁盘写入任何内容? (2认同)

小智 5

如果我有一个不完整的tar档案,我会在档案中创建一个文件列表:

tar tf archive.tar | sed -e '/\/$/d' -e x -e '/^$/d' >files-done
Run Code Online (Sandbox Code Playgroud)

sed命令删除所有那些带有斜杠的行:这些是目录,而不是文件,我们想再次转储目录,只跳过那些目录中的文件,我们已经在第一个 tar 存档中。此外,我们让sed删除最后一个文件名,因为它很可能只是部分转储,所以我们将再次存档。

然后只需通过files-done-X 选项将列表传递给新tar命令:

tar cfvX archive2.tar files-done SOURCEDIR
Run Code Online (Sandbox Code Playgroud)

确保在新的 tar 命令上使用不同的输出文件名,否则您将覆盖部分存档。不要尝试直接附加到损坏的 tar 存档。