bash 脚本来删除选择的文件

bash 脚本来删除选择的文件

我有一系列文件,这些文件根据命名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

相关内容