Ctrl-C 就地递归 gzip - 这可能会破坏任何东西吗?

Ctrl-C 就地递归 gzip - 这可能会破坏任何东西吗?

因此,今天我尝试在 Linux 中压缩一个大文件夹(其中包含大量嵌套的子文件夹)。我这样做了:

gzip -r bigfolder bigfolder.gz

几分钟后,我意识到这不会生成一个大的 gz 文件,而是会单独压缩每个文件(但不是目录)bigfolder。所以我ctrlc这么做了。

然后,我意识到我也弄错了语法(有一天):我以为第二个参数是保存到的位置,但事实并非如此:它只是在 bigfolder 中进行所有压缩。

所以我做了:

gunzip -r bigfolder

一切似乎都恢复正常了。但是,我担心,因为我ctrl-c这样做了,里面可能有一个损坏的文件,该文件在压缩过程中被损坏了。

我的理解是,虽然ctrl-z会立即将其杀死,但ctrl-c更“温和”,更有可能让一个小的子进程(如对单个文件之一进行 gzip 压缩)在停止之前完成。但是,正如您可能猜到的那样,我对这些事情的理解并不是太准确。

我没有 bigfolder 的副本,无法diff查看它是否损坏。您认为它有可能损坏吗?

答案1

首先不要担心,您的文件夹没有损坏。

您使用第一个命令所做的是逐个递归地 gzip 目录结构中的每个文件。gzip将压缩文件并自动删除未压缩的文件(这是默认行为)。但是,在压缩过程中,两个文件都会存在

现在,当你按下ctrl-时c,shell 默认发送信号SIGINT发送给正在前台运行的进程。该信号可被正在运行的进程捕获,因此进程可以处理该信号gzipgzip然后就有可能正常退出。

如果你按ctrl- z,shell 会正常发送信号SIGTSTP这会暂停(停止)进程。如果发生SIGTSTPgzip也会处理它,因为它也是可捕获的。

您不应该终止 ( kill -9 <pid>) 该进程,因为该信号 ( SIGKILL) 无法被进程捕获,因此gzip无法处理它。但即便如此,原始文件仍会存在。

结论:

假设您按下-gzip时正在压缩一个大文件。结果,中止正在处理的文件的压缩并删除部分压缩的文件。现在,有些文件已压缩,有些则没有。ctrlcgzip

gunzip -r folder,所有文件都将解压回其原始状态。唯一的问题是,如果原始目录中有文件压缩;现在已解压缩。

相关内容