如何使用for循环根据已有文件名批量创建对应名称的目录
批量根据txt文件名创建对应去后缀目录的解决方法
错误写法的问题
你之前尝试的几个命令都犯了同一个核心问题:没有移除文件名末尾的.txt后缀,最终生成的目录名都会保留.txt,和你需要的纯文件名前缀的目录名不符。额外的多余大括号、主动追加.txt的写法属于逻辑错误,只会生成完全不符合预期的目录。
可用实现方案
方案1:Bash原生参数扩展(最高效推荐)
使用Bash内置的参数扩展语法直接移除后缀,无需调用额外命令,兼容性好:
for f in *.txt; do mkdir -- "${f%.txt}"; done
说明:
${f%.txt}作用是删除变量f末尾匹配到的.txt后缀,比如red.txt处理后就变成red- 双引号包裹变量是为了兼容文件名带空格、特殊字符的场景
--参数是为了避免文件名以-开头时,被mkdir误识别为命令参数- 如果需要忽略目录已存在的报错,或者要创建嵌套层级的目录,可以给mkdir加
-p参数,改为mkdir -p -- "${f%.txt}"
注意:如果当前目录不存在任何
.txt后缀的文件,Bash默认会把*.txt原样作为变量值,会导致生成名为*.txt的异常目录。可以先执行shopt -s nullglob开启空匹配模式,没有匹配文件时循环会直接跳过,避免异常。
方案2:basename命令实现(跨Shell兼容)
如果你使用的不是Bash环境,可以调用basename命令处理后缀:
for f in *.txt; do mkdir -- "$(basename -- "$f" .txt)"; done
内容的提问来源于stack exchange,提问作者Kourosh Taheri-Golvarzi
相关产品推荐
相关产品推荐

