因此,今天我尝试在 Linux 中压缩一个大文件夹(其中包含大量嵌套的子文件夹)。我这样做了:
gzip -r bigfolder bigfolder.gz
几分钟后,我意识到这不会生成一个大的 gz 文件,而是会单独压缩每个文件(但不是目录)bigfolder
。所以我ctrl就c这么做了。
然后,我意识到我也弄错了语法(有一天):我以为第二个参数是保存到的位置,但事实并非如此:它只是在 bigfolder 中进行所有压缩。
所以我做了:
gunzip -r bigfolder
一切似乎都恢复正常了。但是,我担心,因为我ctrl-c这样做了,里面可能有一个损坏的文件,该文件在压缩过程中被损坏了。
我的理解是,虽然ctrl-z会立即将其杀死,但ctrl-c更“温和”,更有可能让一个小的子进程(如对单个文件之一进行 gzip 压缩)在停止之前完成。但是,正如您可能猜到的那样,我对这些事情的理解并不是太准确。
我没有 bigfolder 的副本,无法diff
查看它是否损坏。您认为它有可能损坏吗?
答案1
首先不要担心,您的文件夹没有损坏。
您使用第一个命令所做的是逐个递归地 gzip 目录结构中的每个文件。gzip
将压缩文件并自动删除未压缩的文件(这是默认行为)。但是,在压缩过程中,两个文件都会存在。
现在,当你按下ctrl-时c,shell 默认发送信号SIGINT
发送给正在前台运行的进程。该信号可被正在运行的进程捕获,因此进程可以处理该信号gzip
。gzip
然后就有可能正常退出。
如果你按ctrl- z,shell 会正常发送信号SIGTSTP
这会暂停(停止)进程。如果发生SIGTSTP
,gzip
也会处理它,因为它也是可捕获的。
您不应该终止 ( kill -9 <pid>
) 该进程,因为该信号 ( SIGKILL
) 无法被进程捕获,因此gzip
无法处理它。但即便如此,原始文件仍会存在。
结论:
假设您按下-gzip
时正在压缩一个大文件。结果,中止正在处理的文件的压缩并删除部分压缩的文件。现在,有些文件已压缩,有些则没有。ctrlcgzip
和gunzip -r folder
,所有文件都将解压回其原始状态。唯一的问题是,如果原始目录中有文件是压缩;现在已解压缩。