如何使用find查找文件并删除WAVECAR
时间:2025-10-29 作者:Jiaqi Z.
分类:材料计算
在使用VASP计算过程中,如果你设置LWAVE=.TRUE.的话,在计算结果中会生成一个WAVECAR文件。一方面来说,生成WAVECAR可以生成一个初始波函数,方便后续计算收敛。但在大多数情况下,这一过程是没有必要的(可能在之前的VASP计算教程里明确提及这一点的地方,也仅仅是在计算HSE能带时用到了)。因此,很多时候我们都会默认设置INCAR里面的参数LWAVE=.FALSE.。
而事实上,总会有一些人(当然也包括我。。)在写输入文件时忘记这一点,而生成了非常非常大的WAVECAR文件,如果提前意识到,直接使用rm命令删掉当然可以。但如果忘记了呢?你会继续下去一直计算,而这时候大概率你也不会想起来要删除它。计算目录越来越多……计算文件越来越大……而这时候,当你下载目录到本地时……你会意识到WAVECAR(也可能会有CHGCAR)浪费了你大多数的时间
更严重的情况,如果你长时间不删除这些文件的话,服务器硬盘总是会满的……往小了说,对于超算来说存储空间也是花钱买来的;往大了说,如果是用自己课题组的服务器,硬盘满了,自己和别人都算不了了(无法写入文件)……
这时,你可能会想删除掉所有的WAVECAR。但是,一个一个删太慢,有没有一次性的方法删除?
什么是find命令?
在Linux当中,find命令可以用来在指定目录下查找文件和目录。一个基本的格式是find [路径] [条件] [动作]。
其中,路径表示你要查找的目录路径,例如,在当前目录下查找,可以使用find . [条件] [动作]表示(事实上,直接执行也表示当前目录)
条件可以用来指定要查找的文件,有好几种可以使用的选项,我们下面列举几个可能会用到的:
-name表示要查找的文件名,可以使用通配符,例如find . -name roselia表示在当前目录下寻找名字叫做roselia的文件。find . -name *.txt表示在当前目录下寻找后缀名为.txt的所有文件。如果希望查找多个文件,可以使用-o分隔(表示或),例如,find . -name yukina -o -name rinrin表示在当前目录下查找文件名为yukina或rinrin的文件(等价于查找两个文件)
(不要问我怎么查找同时满足名字为yukina和rinrin的文件…… 除非你的文件是类似薛定谔的猫那样的状态……)
type表示文件类型,包括f普通文件,d目录等
在目前的使用场景下,这些已经足够大多数情况了,如果还需要其他的参数(如-size, -user等),可以去网上查找相关资料。另外,上面两个参数可以混合使用,例如find ./roselia -name nonchan -type f表示在当前目录下的roselia子目录下查找名字叫nonchan的文件
一个现在你就可以用的场景——查找任务目录
如果你在计算时有记录的习惯,可能会记录任务的队列号(在提交任务时,通常队列系统会在当前目录下生成一个含有队列号的文件,表示队列系统的输出信息,以slurm系统为例,可能会生成slurm-[JOBID].out文件)借助这个文件,我们就可以通过队列号查找到计算的目录,从而方便我们快速进入到对应目录而不用一次次cd了。
方法很简单,使用find ~ -name slurm-[JOBID].out即可输出文件所在的目录。把[JOBID]替换为你的队列号。例如,队列号为1441,则将其替换为slurm-1441.out(或者你也可以简单使用*-1441.out,但前提是没有其他类似的文件)。上述命令表示在家目录下寻找任务号为[JOBID]的输出文件。关于为什么是在家目录下寻找——你不可能每次查找的文件都在当前目录向下可以找到。
关于find命令的动作参数
当执行动作时,通常前面需要有一个选项-exec表示执行命令,在选项后面为要执行的命令,你可以使用{ }表示查找到的文件(占位符),使用\;表示命令结束。
在这个基础上,我们就可以解决最开始的问题了:如何删除当前目录中所有的WAVECAR文件?
(如果你想直接知道最开始的结果,可以看这里了!!但我强烈建议看明白前面,不然你很可能一会儿就忘了)
执行下面的命令:find . -name WAVECAR -type f -exec rm {} \;,具体原理结合上面的说明,应该很容易理解。类似的,如果希望删除CHGCAR和CHG文件,则可以使用find . -name CHG* -type f -exec rm {} \;(使用了通配符*表示CHG和CHGCAR文件)
务必注意:\;前面要有空格!!
前方小高能!!下面的内容作为补充,有点难,可以尝试理解一下
那如何同时删除WAVECAR和CHGCAR呢?借助-o命令,使用下面的命令:
find . \( -name WAVECAR -o -name CHGCAR \) -type f -exec rm {} \;
这里面使用\( \)作为括号提高优先级,也就是\( A -o B \) C表示 (A或B)且C,按照布尔运算规则也就是A或C且B或C。但如果没有这个括号的话,就会识别为A或(B且C)。
上一篇:如何结合CP2K+Multiwfn做ELF拓扑分析
下一篇:这次杂谈部分改版了什么?
同分类上一篇:如何结合CP2K+Multiwfn做ELF拓扑分析
同分类下一篇:没有了