需求描述
在使用 linux 服务器运行代码保存 checkpoint 或处理工程文件时,经常会涉及文件或文件夹的批量操作,以删除 checkpoint 文件夹为例。
以下是某次模型训练保存的 checkpoint 文件
.
├── checkpoint-1000
├── checkpoint-2000
├── checkpoint-15000
├── runs
└── others
如果现在不想保留之前老旧的 checkpoint,如 checkpoint-1000/2000,可以通过 find 命令嵌套搭配 rm 命令实现,具体如下。
方法一
find . -maxdepth 1 -type d ! -name 'checkpoint-15000' ! -name 'runs' ! -name '.' -exec rm -rf {} +
其中,各部分的具体含义为:
- 使用 find 命令从当前目录开始搜索(.)。
- 限制搜索深度为1层目录(-maxdepth 1)。
- 搜索类型为目录(-type d)。
- 排除名称为 checkpoint-15000 的目录(! -name ‘checkpoint-15000’)。
- 排除名称为 runs 的目录(! -name ‘runs’)。
- 排除当前目录本身(! -name ‘.’)。
- 对搜索结果执行删除操作(-exec rm -rf {} +)。
- -exec:这是 find 命令的一个选项,用来执行指定的命令。
- rm -rf:这是要执行的命令,其中:
- rm 是删除文件或目录的命令。
- -r 选项表示递归删除,用于删除目录及其内容。
- -f 选项表示强制删除,不会提示确认。
- {}:这是一个占位符,表示 find 命令找到的每一个文件或目录。find 会用找到的文件或目录替换这个占位符。
- +:表示以批处理方式执行命令,即 find 会尽可能多地收集文件名,并将它们作为一个批次传递给 rm 命令。这样可以减少命令执行次数,提高效率。
方法二
也可以使用稍有区别的另外一条指令改善指令可读性,原理同上。
find . -mindepth 1 -maxdepth 1 -type d ! -name 'checkpoint-15000' ! -name 'runs' -exec rm -rf {} +