Bash遍历目录替换空格为下划线,如何避免无效报错?
解决Bash替换目录名空格为下划线时的无效报错问题
原脚本遍历所有目录时,对不含空格的目录,${dir// /_}生成的新名称和原目录名完全一致,执行mv就会触发"cannot move ... to a subdirectory of itself"的报错。以下是两种简洁的解决方式:
方式一:添加空格判断(兼容性强)
在循环中增加条件判断,仅当目录名包含空格时才执行重命名操作:
for dir in */; do [[ "$dir" == *" "* ]] && mv "${dir}" "${dir// /_}" done
[[ "$dir" == *" "* ]]用于检测目录名中是否存在空格,满足条件才执行后续的mv命令,避免无意义的操作和报错。
方式二:使用rename命令(更简洁)
如果系统支持Perl版本的rename(多数Linux发行版默认自带),可以直接用一行命令完成:
rename 's/ /_/g' */
该命令会批量将所有目录名中的空格替换为下划线,若目录名原本无空格,rename会自动跳过,不会产生报错。
若你的系统是util-linux版本的rename,则使用以下语法:
rename ' ' '_' */
内容的提问来源于stack exchange,提问作者dubg
相关产品推荐
相关产品推荐

