Dockerfile中使用mv命令筛选移动指定扩展名且名称不含特定字符串的文件
Dockerfile中使用mv命令筛选移动指定扩展名且名称不含特定字符串的文件
这个需求在Docker镜像构建里挺常见的,要精准筛选出符合条件的文件移动,咱们可以用两种比较靠谱的方案,看你习惯哪种:
方案一:用find命令(推荐,简洁高效)
find命令本身自带强大的文件筛选能力,刚好能满足你的需求。在Dockerfile里可以这么写:
RUN find /path/to/src -maxdepth 1 -type f -name "*.txt" ! -name "*abc*" -exec mv {} /path/to/dest \;
我给你拆解下每个参数的作用:
-maxdepth 1:只查找当前src目录下的文件,不会递归子目录(如果需要递归可以去掉这个参数)-type f:确保只处理普通文件,排除目录或链接-name "*.txt":筛选出所有.txt后缀的文件! -name "*abc*":排除文件名中包含abc的文件-exec mv {} /path/to/dest \;:对每个符合条件的文件执行mv命令,{}会被替换成找到的文件名
方案二:用Shell循环(更灵活,适合后续扩展)
如果你觉得find的参数有点绕,或者之后还要给移动操作加额外逻辑,用Shell循环会更直观:
RUN bash -c 'for file in /path/to/src/*.txt; do \ if [[ ! "$file" == *abc* ]]; then \ mv "$file" /path/to/dest; \ fi; \ done'
这里要注意:
- 因为默认有些基础镜像的
sh不支持[[ ]]的条件判断语法,所以用bash -c来指定用bash执行 - 循环遍历所有
.txt文件,通过[[ ! "$file" == *abc* ]]判断文件名是否不含abc,符合条件就移动
针对你给出的例子(abc.txt, abcu.txt, def.xml, 1abc2.txt, mno.txt, pqr.txt),上面两个方案都会精准移动mno.txt和pqr.txt到目标目录,完全符合你的要求。
备注:内容来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

