如何按文本文件每行内容创建文件夹及嵌套目录?
按文件每行内容创建文件夹(含嵌套目录)
首先得明确:你当前写的代码不可行,因为它完全没用到文件里的行内容,而是用循环的索引值($i)当文件夹名,而且循环范围还多了一个(比如文件有3行,会创建0、1、2、3这4个文件夹),完全不符合“按每行内容创建”的需求,得彻底调整写法。
一、创建单级文件夹(每行对应一个独立文件夹)
如果你的文件每行是单个文件夹名称(比如每行是docs、images这种),可以用while read循环来逐行读取内容并创建文件夹,这样能正确处理含空格、特殊字符的名称:
# 读取filename文件的每一行,创建对应文件夹 while IFS= read -r line; do # 跳过空行(可选,根据需求调整) if [ -n "$line" ]; then mkdir -- "$line" fi done < filename
这里的细节很重要:
IFS=:保留行首/行尾的空格,避免被自动截断read -r:禁止反斜杠被转义,保证行内容原样读取--:防止以-开头的文件夹名称被当成mkdir的命令选项- 加
if [ -n "$line" ]:跳过文件里的空行,避免创建空名称的文件夹
二、创建嵌套目录(每行是完整的嵌套路径)
如果你的文件每行是类似a/b/c、project/src/utils这种嵌套路径,只需要给mkdir加-p参数(自动创建所有不存在的父目录)即可:
# 读取每行的嵌套路径,创建完整的目录结构 while IFS= read -r line; do if [ -n "$line" ]; then mkdir -p -- "$line" fi done < filename
比如文件里有一行foo/bar/baz,执行后会自动创建foo、foo/bar、foo/bar/baz这三级目录,即使父目录原本不存在。
三、额外注意事项
- 如果怕重复创建已存在的文件夹导致报错,可以用
mkdir -p(不管目录是否存在都不会报错),或者加判断:if [ ! -d "$line" ]; then mkdir -- "$line"; fi - 确保你对目标路径(比如你代码里的
/PATH/)有写入权限,否则会提示权限错误 - 如果文件里的行包含特殊字符(比如
&、*、空格),一定要用双引号包裹$line,否则会被shell解析成其他含义 - 如果你的文件是Windows格式的换行(
\r\n),可以先用dos2unix filename转成Unix格式,避免读取到奇怪的字符
内容的提问来源于stack exchange,提问作者Hossein Najafzade Rahaghi
相关产品推荐
相关产品推荐

