我尝试使用tar
以递归方式压缩.lammpstrj
目录树中所有带有扩展名的文件,从路径存储在变量中的目录开始home
。home
包含包含我的命令的脚本和 57 个子目录,每个子目录包含一对名为和tar
的子子目录。每个或目录包含一个文件。我用来完成此任务的循环是:Soft_Pushoff
Equilibrium_NVT
Soft_Pushoff
Equilibrium_NVT
.lammpstrj
for index in $(seq 1 57)
do
cd $home/$index/Soft_Pushoff/
file=`find ./ -mindepth 1 -maxdepth 1 -name "*.lammpstrj" -print`
tar cvf - ./$file | gzip -9 - > $file.tar.gz
cd $home/$index/Equilibration_NVT/
file=`find ./ -mindepth 1 -maxdepth 1 -name "*.lammpstrj" -print`
tar cvf - ./$file | gzip -9 - > $file.tar.gz
done
当它扫描 的 57 个子目录之一时home
,此部分代码通常会打印:
././equilibration_nvt.lammpstrj
././soft_pushoff.lammpstrj
到终端。然而,在 3 个不同的实例中,这段代码打印出来的内容如下:
././equilibration_nvt.lammpstrj
././soft_pushoff.lammpstrj
./
./time.txt
./soft_pushoff.restart.10000
./equilibration_nvt.lmp
./.tar.gz
tar: ./.tar.gz: file changed as we read it
./equilibration_nvt_pitzer.sh
./eps.txt
././soft_pushoff.lammpstrj
././equilibration_nvt.lammpstrj
我使用的命令不tar
应该对“标记”的文件进行操作tar
,所以我很困惑为什么它们会与警告消息一起列出tar: ./.tar.gz: file changed as we read it
?此外,这些文件实际上并没有像tar
对文件进行操作那样发生变化.lammpstrj
。如何解释此警告消息?最重要的是,我能否相信.lammpstrj.tar.gz
我的命令写入的文件都tar
没有损坏,尤其是与此警告消息相关的文件?
如果这相关的话,我的脚本正在远程服务器上运行。.lammpstrj
我尝试压缩的文件大小高达 15.2 Gb。我的脚本在此远程服务器上运行大约需要 2.5 天。
如果
$file
为空,那么您最终会运行,tar cvf - ./ | gzip -9 > .tar.gz
这将导致您看到的错误消息;您正在对当前目录进行压缩,其中将包含您意想不到的文件,并且文件.tar.gz
本身将成为存档的一部分。要么你
find
没有按照你的预期做,要么你需要在周围进行安全检查tar
例如
你确实把事情复杂化了——使用你的 shell 获取匹配文件的列表,然后浏览这些文件。让我们摆脱那里所有不合时宜的东西——现在通常使用
$(…)
而不是 来完成进程替换(既写起来更安全又可嵌套!),当你有 时,它是多余的,而且据我所知,任何能够应用 gzip 压缩的程序都可以自己应用……只要我一直在使用电脑,我想。所以,你的整个脚本简化为:(替换为(15 是 zstd 的一个非常高的压缩设置)在我们上面的讨论之后,你说压缩率对你很重要)…
seq begin end
{begin..end}
tar
gzip --best
zstd -15
当然,如果你将所有文件压缩到一个存档中,压缩效果会更好,因为我怀疑它们中有些部分是相似的,因此如果将它们放在同一个存档中,压缩效果会非常好。这也更简单;不需要
for
循环