我使用以下命令并行压缩目录中的所有文件:
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
一次压缩一个文件。