Shell脚本遍历目录时如何移除路径中的多余斜杠?
解决Shell脚本中目录路径双斜杠问题
嘿,这个问题我之前也碰到过!原因很简单:*/匹配出来的目录名称自带末尾的斜杠,和你手动添加的/zipfolder拼接后就出现了双斜杠,导致路径解析出错。这里有几个简单又靠谱的解决办法:
方法1:用Shell参数扩展移除末尾斜杠(推荐)
这是最直接高效的方式,不需要额外工具,纯Shell语法就能搞定,兼容性拉满:
for D in */ ; do # ${D%/} 会移除变量D末尾的斜杠 mv *.zip "/home/user/${D%/}/zipfolder" done
${D%/}的逻辑是:从变量D的末尾开始匹配最短的/字符并删除它,完美解决双斜杠问题。而且一定要记得给变量加双引号,避免目录名里有空格或者特殊字符时出现意外。
方法2:用basename命令提取纯目录名
如果你更习惯用外部命令,basename可以帮你提取路径中的目录名称(自动去掉末尾斜杠):
for D in */ ; do dir_name=$(basename "$D") mv *.zip "/home/user/$dir_name/zipfolder" done
这个方法逻辑很直观,但因为多了一个子进程调用,性能上比参数扩展稍差一点,不过对于日常脚本来说完全够用。
额外提醒:处理空目录匹配的情况
如果当前目录下没有子目录,*/会原样输出,可能导致命令出错。可以提前开启nullglob选项让空匹配直接返回空:
shopt -s nullglob for D in */ ; do mv *.zip "/home/user/${D%/}/zipfolder" done
这样如果没有子目录,循环根本不会执行,避免不必要的错误。
内容的提问来源于stack exchange,提问作者Márk Maros
相关产品推荐
相关产品推荐

