我一直在运行此命令将每个子目录压缩到一个 zip 文件中:
nohup sh -c 'for i in */; do zip -r "${i%/}.zip" "$i"; done' &
话虽如此,我的空间不足了,我试图弄清楚是否有任何 zip 文件只是部分完成,或者如果无法完成它,它是否会导致 zip 失败?我的 nohup.out 似乎表明,如果它无法完成完整的压缩,它不会进行部分压缩。有人知道吗?
答案1
它不会创建部分 zip 文件。我刚刚做了以下测试。
dd if=/dev/zero of=test.dat bs=1M count=10 # create a 10MB file
mkfs.ext4 test.dat #create ext4 filesystem in the file
mount test.dat /mnt # mount the file to /mnt
cd /mnt # go to the new device, which is only less than 10MB
dd if=/dev/urandom of=test.dat bs=1M count=8
zip test.zip test.dat
zip 命令失败,因为 /mnt 中没有足够的空间,并且没有创建 zip 文件。如果您查看strace
该过程,您可以看到它在工作时创建了一个具有随机文件名的临时文件:
openat(AT_FDCWD, "test.zip", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("test.dat", {st_mode=S_IFREG|0644, st_size=8388608, ...}) = 0
stat("test.zip", 0x5586eb6642e0) = -1 ENOENT (No such file or directory)
stat("test.dat", {st_mode=S_IFREG|0644, st_size=8388608, ...}) = 0
openat(AT_FDCWD, "/etc/localtime", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "test.zip", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
close(3) = 0
stat("test.zip", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
unlink("test.zip") = 0
getpid() = 16464
openat(AT_FDCWD, "zirEX4VT", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
从上面的跟踪中可以看到,它创建了一个名为 的文件zirEX4VT
,然后在跟踪的末尾:
write(1, "\nzip I/O error: No space left on"..., 39
zip I/O error: No space left on device) = 39
close(3) = 0
unlink("zirEX4VT")
文件zirEX4VT
被删除。