我有一系列文件,这些文件根据命名field.%d.vtk
并在我运行 C++ 代码时生成。代码在 for 循环内进行一系列计算,并在i%N == 0
循环i
变量N
为常量时转储输出。我错误地设置了N = 1
,现在我有大量我不需要的数据。我也不想重新运行代码。
我如何编写一个 bash 脚本来仅保留每个N
文件,删除其余文件,并重命名剩余文件,以使其中的数字field.%d.vtk
连续?抱歉,如果这很简单,但我对 bash 脚本的经验非常有限。
编辑:当N=1
(错误地)范围%d
在 [0, 1, ..., O(100,000)](非常大)时,合适的N
范围是N=100
将文件数量缩小到 O(1000) 左右。
谢谢
答案1
如果 N=100,那么删除它们就相当容易了。下面将删除所有不以 00.vtk 结尾的文件
find -name '*.vtk' -not -name '*00.vtk' -exec rm {} +
因此这将留下 100.vtk、200.vtk 等
然后为了使它们连续,您只需去掉 00:
rename 00.vtk .vtk *.vtk
假设使用标准 posix 重命名。如果您安装了 perl 重命名,则为:
rename 's/00.vtk/.vtk/' *.vtk
答案2
for i in *.vtk
do
[[ $i =~ \.([0-9]*)\. ]] && ((BASH_REMATCH[1] % 100 != 0)) && echo $i
done
当您仔细检查此命令后更改echo
为!rm
答案3
Paul 的答案的仅限 Bash( 4+) 版本(因此,它只会保留每 100 个文件 .vtk 文件,即以 结尾的文件00.vtk
,并通过剥离 来重命名它们00
):
shopt -s extglob
rm ./!(*00).vtk
for f in ./*.vtk; do mv "$f" "${f%00.vtk}.vtk"; done
如果你想要递归:
shopt -s extglob globstar
rm ./**/!(*00).vtk
for f in ./**/*.vtk; do mv "$f" "${f%00.vtk}.vtk"; done