将并行创建的 .zip 文件复制到创建后的位置

将并行创建的 .zip 文件复制到创建后的位置

我使用以下命令并行压缩目录中的所有文件:

cd /volume1/Backup/VHDX; for i in */; do zip -0 -r "${i%/}.zip" "$i" & done; wait

创建所有 zip 文件后,我将它们移动到 NTFS 格式的 USB 驱动器,如下所示:

cd /volume1/Backup/VHDX; find . -name "*.zip" -exec cp {} /volumeUSB1/usbshare \;

我想知道是否可以在创建每个 .zip 文件后将其直接移动到目标位置(因此将副本添加到第一个命令),而不是先创建所有 zip 文件,然后仅在创建所有 zip 文件后才开始复制它们。有办法吗?

直接在 USB 驱动器上创建 zip 非常慢(需要压缩大量数据),这就是为什么我先在本地创建它,然后再移动它。

答案1

首先让我们解开你的一行代码:

cd /volume1/Backup/VHDX
for i in */; do
    zip -0 -r "${i%/}.zip" "$i" &
done
wait

zip完成后移动文件:

cd /volume1/Backup/VHDX
for i in */; do
    zip -0 -r "${i%/}.zip" "$i"
    mv "${i%/}.zip" /volumeUSB1/usbshare &
done
wait

但是现在我们一次只压缩一个目录,可能同时移动已完成的文件。我们可以通过使用子 shell 来解决这个问题:

cd /volume1/Backup/VHDX
for i in */; do
    (zip -0 -r "${i%/}.zip" "$i" && mv "${i%/}.zip" /volumeUSB1/usbshare) &
done
wait

或者,您也可以使用多个 CPU 线程,而pigz不是zip一次压缩一个文件。

相关内容