Linux Samba共享目录下批量给文件添加分类前缀重命名需求
Linux Samba目录批量文件分类重命名方案
需求概述
- 针对Samba共享指定目录下的当前文件(不含子目录)批量重命名
- 保留原文件名、扩展名及大小写,仅添加指定分类前缀
- 按文件名中的关键词(不区分大小写)匹配分类,支持多关键词(如python、ansible、git)
- 要求无错误、无数据丢失
示例对比
原文件
a guide to Python.pdf
stay busy with python.epub
ansible tips and tricks.azw3
Ansible secrets.mobi
ANSIBLE for beginners.
_GIT cheat sheet dark (FINAL).png
目标效果
python - a guide to Python.pdf
python - stay busy with python.epub
ansible - ansible tips and tricks.azw3
ansible - Ansible secrets.mobi
ansible - ANSIBLE for beginners.
git - _GIT cheat sheet dark (FINAL).png
优化解决方案
1. 多关键词批量处理脚本
使用Bash脚本实现多关键词匹配、避免重复处理、防止文件覆盖:
#!/bin/bash # 定义关键词与对应前缀的映射(关键词不区分大小写) declare -A keyword_map=( ["python"]="python - " ["ansible"]="ansible - " ["git"]="git - " ) # 开启不区分大小写的文件名匹配 shopt -s nocaseglob # 遍历当前目录下的所有文件(跳过目录) for file in *; do [ -f "$file" ] || continue # 跳过已添加过前缀的文件,避免重复处理 if [[ "$file" =~ ^(python|ansible|git) - ]]; then continue fi # 匹配关键词并执行重命名 for keyword in "${!keyword_map[@]}"; do if [[ "$file" == *"$keyword"* ]]; then new_name="${keyword_map[$keyword]}$file" # 检查新文件是否存在,防止覆盖数据 if [ ! -e "$new_name" ]; then mv -v "$file" "$new_name" else echo "⚠️ 警告:$new_name 已存在,跳过 $file" fi break fi done done # 关闭不区分大小写匹配 shopt -u nocaseglob
2. 脚本使用说明
- 将脚本保存为
rename_files.sh,赋予执行权限:chmod +x rename_files.sh - 切换到目标Samba目录,执行脚本:
./rename_files.sh - 建议先复制部分文件到测试目录验证效果,再批量处理
3. 原有命令的局限性
你之前尝试的单关键词命令:
for file in *nsible*; do mv "$file" "ansible - $file"; done;
存在以下问题:
- 仅支持单个关键词匹配,无法批量处理多分类
- 默认区分大小写,无法匹配
Ansible、ANSIBLE这类变体 - 无重复处理防护,重复执行会多次添加前缀
- 未检查文件是否存在,可能导致数据覆盖
注意事项
- 确保当前用户对Samba目录拥有读写权限
- 脚本仅处理当前目录的文件,不会遍历子目录
- 若文件匹配多个关键词,会优先使用映射中先定义的分类前缀
内容的提问来源于stack exchange,提问作者Hr13aale
相关产品推荐
相关产品推荐

