Linux下Shell脚本:查找指定命名规则的二级子目录并重命名
没问题,我来帮你搞定这个Shell脚本需求!这里有个完整的实现方案,还会一步步拆解逻辑,方便你根据自己的实际命名规则调整。
完整Shell脚本
#!/bin/bash # 定义要移除的前缀和目录匹配规则 PREFIX="andrew-" # 这里的匹配规则可以根据你的实际需求修改,比如"proj-*"等 MATCH_PATTERN="${PREFIX}*" # 在主目录下查找最多2级深度的目标目录 find ~ -maxdepth 2 -mindepth 1 -type d -name "$MATCH_PATTERN" | while IFS= read -r dir; do # 获取目录的原始名称(不带路径) original_name=$(basename "$dir") # 移除前缀得到新名称 new_name=${original_name#$PREFIX} # 执行重命名(如果想先预览操作,把下面的mv改成echo mv即可) mv "$dir" "$(dirname "$dir")/$new_name" echo "已重命名: $dir → $(dirname "$dir")/$new_name" done
脚本逻辑拆解
目录查找部分:
find ~ -maxdepth 2 -mindepth 1 -type d -name "$MATCH_PATTERN":~代表当前用户的主目录;-maxdepth 2限制查找深度最多为2级(主目录下直接子目录是1级,子目录里的子目录是2级);-mindepth 1排除主目录本身;-type d只筛选目录,不会匹配文件;-name "$MATCH_PATTERN"按照你定义的命名规则匹配目录,这里是匹配以andrew-开头的目录。
重命名部分:
while IFS= read -r dir:保证包含空格的目录路径能被正确读取,避免截断;original_name=$(basename "$dir"):提取目录的纯名称(去掉前面的路径);new_name=${original_name#$PREFIX}:用Shell参数展开移除前缀,#符号表示从字符串开头删除最短的匹配前缀;mv "$dir" "$(dirname "$dir")/$new_name":拼接新的路径,完成目录重命名。
注意事项
- 先预览再执行:如果不确定操作是否正确,可以把脚本里的
mv改成echo mv,这样会打印出要执行的重命名命令,确认无误后再改回mv。 - 自定义规则:修改
PREFIX和MATCH_PATTERN变量,就能适配你的实际命名需求,比如要移除proj-前缀,就把PREFIX设为proj-,MATCH_PATTERN设为proj-*。 - 权限问题:确保你对目标目录有读写权限,否则重命名会失败。
内容的提问来源于stack exchange,提问作者Andrew Nguyen
相关产品推荐
相关产品推荐

