如何恢复被杀死的tar命令


11

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

我可以从停止任务的那一刻起恢复吗?


目标位置中是否有不完整的tar文件?
Karthik T

是的,有一个不完整的焦油。
mthpvg 2012年

Answers:


11

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

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

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

说明:

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

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

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


2
我认为这比重新启动tar进程要快,因为它实际上没有将任何内容写入磁盘吗?
泰勒

2

最好的解决方法是删除tar文件,然后重新启动前置与过程nohup,并追加&。或者,您可以运行tar -tfv并将其用作new的排除项tar -cvf


2
tar -cvf将覆盖现有文件。你是说tar -rvf吗 另外,写入存档的最后一个文件可能不完整。
吉尔斯(Gillles)“所以-别再作恶了”

因此,其想法是列出已存在于tarball中的文件列表,减去最后一个可能不完整的文件。然后运行tar -rvf
mthpvg


1

tar档案不完整的情况下,我会在档案中创建文件列表:

tar tf archive.tar | sed -e '/\/$/d' -e x -e '/^$/d' >files-done

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

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

tar cfvX archive2.tar files-done SOURCEDIR

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.