Ubuntu下如何按文件名中的算术条件筛选并移动文件
Ubuntu下如何按文件名中的算术条件筛选并移动文件
嗨,这个需求在Ubuntu下用命令行就能轻松搞定,给你两个实用的方案,按需选择就行:
方案一:用find命令(支持递归搜索,也可限制仅当前目录)
如果你的文件分散在子目录里,或者想统一处理当前目录及子目录的文件,这个方案很合适:
# 替换成你实际的目标目录路径 target_dir="/path/to/your/target/folder" mkdir -p "$target_dir" find . -maxdepth 1 -type f -name "image_*_*.png" -exec sh -c ' for file do # 分割文件名,提取N1和N2的数值 IFS="_." read -r ignore n1 n2 ext <<< "$(basename "$file")" # 判断N2等于0且N1小于等于18003 if [ "$n2" -eq 0 ] && [ "$n1" -le 18003 ]; then mv "$file" "$target_dir/" fi done ' sh {} +
命令说明:
-maxdepth 1:限制仅搜索当前目录,去掉这个参数就会递归搜索所有子目录-type f:只处理普通文件,避免误操作目录-name "image_*_*.png":先筛选出符合命名格式的PNG文件,缩小处理范围- 后面的shell脚本会把每个匹配的文件拆分,提取N1和N2的数值,再做算术判断,符合条件就移动到目标目录
方案二:直接用for循环(仅当前目录,更简洁高效)
如果所有目标文件都在当前目录,没有子目录需要处理,这个方案更简单直接:
# 替换成你实际的目标目录路径 target_dir="/path/to/your/target/folder" mkdir -p "$target_dir" # 先筛选出N2=0的文件,再判断N1的数值 for file in image_*_0.png; do # 提取N1部分:去掉开头的"image_"和结尾的"_0.png" n1="${file#image_}" n1="${n1%_0.png}" # 判断N1是否小于等于18003 if [ "$n1" -le 18003 ]; then mv "$file" "$target_dir/" fi done
温馨提示:
- 一定要把命令里的
/path/to/your/target/folder换成你实际要移动到的目录,比如~/selected_images或者/home/yourname/my_images - 不确定命令是否正确的话,可以先把
mv换成echo,这样会先打印出要移动的文件,确认无误后再改回mv mkdir -p会自动创建目标目录(如果不存在的话),避免移动时因为目录不存在报错
备注:内容来源于stack exchange,提问作者SpaceLover
相关产品推荐
相关产品推荐

